关于java:如何使用Mockito编写void方法的行为?

How to program behavior of a void method with Mockito?

本问题已经有最佳答案,请猛点这里访问。

我有一个像这样的控制器类

1
2
3
public void create(int a, int b){
     //do something
}

现在,我想模拟控制器类,并在调用模拟控制器类的create方法时为exmaple docustomCreate()调用一个特定的方法。

我的测试看起来像这样

1
2
Controller ctrlMock = mock(Controller.class);
//PseudoCode: when(isCalled(ctrlMock.create(a,b)).doCall(doCustomCreate());

我只阅读了有关使用输入和返回值模拟方法的内容,所以我想知道这是否可能?

编辑:更新问题


只需将此API用于void方法:

1
doAnswer(doCustomCreate()).when(ctrlMock).create(a,b);

或使用BDDMockito

1
willAnswer(doCustomCreate()).given(ctrlMock).create(a,b);

其中,doCustomCreate()返回Answer(即返回null)。注:我使用Void只是为了表明这个答案不会返回任何内容。

1
2
3
4
5
6
7
8
public Answer<Void> doCustomCreate() {
    return new Answer<Void>() {
        public Void answer(InvocationOnMock invocation) {
            // your stuff
            return null;
        }
    }
}

注:为模拟提供行为在某种程度上是测试可维护性的一条崎岖之路,因为这意味着测试组件不在纯受控环境/隔离中进行测试。


因此,您希望为某个方法重写模拟的行为。解决这个问题的方法是使用所谓的Spy(即部分模拟)而不是模拟:http://site.mockito.org/mockito/docs/current/org/mockito/mockito.html 16