本问题已经有最佳答案,请猛点这里访问。
我有一个像这样的控制器类
public void create(int a, int b){
//do something
}
现在,我想模拟控制器类,并在调用模拟控制器类的create方法时为exmaple docustomCreate()调用一个特定的方法。
我的测试看起来像这样
Controller ctrlMock = mock(Controller.class);
//PseudoCode: when(isCalled(ctrlMock.create(a,b)).doCall(doCustomCreate());
我只阅读了有关使用输入和返回值模拟方法的内容,所以我想知道这是否可能?
编辑:更新问题
列表是模拟对象的私有字段。你为什么在乎它包含什么?你似乎想让模仿者做如果没有被模仿的话它会做什么。
google"mockito void method",第一个结果
@jbinzet实际上在技术上是一个包级别的保护。尽管我怀疑它在作者代码中的实际用途。
似乎你试图用一个模拟来达到一个与它真正意图不同的目的。请你多解释一下你想测试什么?
瑞:为什么?我使用mockito的确切目的,因为mockito是设计的。
我更新了问题也许现在更清楚了一点
@Goblins我认为@ray意味着你可能会考虑使用stub,而不是mock。这就解释了区别。
只需将此API用于void方法:
doAnswer(doCustomCreate()).when(ctrlMock).create(a,b);
或使用BDDMockito:
willAnswer(doCustomCreate()).given(ctrlMock).create(a,b);
其中,doCustomCreate()返回Answer(即返回null)。注:我使用Void只是为了表明这个答案不会返回任何内容。
public Answer doCustomCreate() {
return new Answer() {
public Void answer(InvocationOnMock invocation) {
// your stuff
return null;
}
}
}
注:为模拟提供行为在某种程度上是测试可维护性的一条崎岖之路,因为这意味着测试组件不在纯受控环境/隔离中进行测试。
这可能是我要找的,我会试试的。
@Goblins我已经更新了关于更完整使用信息的答案。
因此,您希望为某个方法重写模拟的行为。解决这个问题的方法是使用所谓的Spy(即部分模拟)而不是模拟:http://site.mockito.org/mockito/docs/current/org/mockito/mockito.html 16
不,这与我想做的相反。我不想调用真正的方法,因为那时我需要什么样的模拟?我想调用我自己的方法。如果您要将'when(mock.somemethod()).thencallrealmethod();'by'替换为'when(mock.somemethod()).thencallmycustommethod();'则它是逻辑的。