如何使用Mockito编写void方法的行为?

时间:2015-01-05 12:52:36

标签: java junit mocking mockito

我有一个类似这样的Controller类

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

现在我想模拟Controller类,并在调用模拟的Controller类的create方法时为exmaple doCustomCreate()调用某个方法。

我的测试会看起来像这样

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

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

编辑:更新了问题

2 个答案:

答案 0 :(得分:4)

只需将此API用于void方法:

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

BDDMockito

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

其中doCustomCreate()返回Answer(返回null)。注意我使用Void仅表示此答案不返回任何内容。

public Answer<Void> doCustomCreate() {
    return new Answer<Void>() {
        public Void answer(InvocationOnMock invocation) {
            // your stuff
            return null;
        }
    }
}

注意,给模拟提供行为在某种程度上是测试可维护性的一条前景,因为这意味着测试的组件不会在纯控制环境/隔离中进行测试。

答案 1 :(得分:0)

所以你想要覆盖某个方法的mock的行为。对此的解决方案是使用所谓的间谍(AKA局部模拟)而不是模拟:http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html#16