如何使用 Mockito 对 void 方法的行为进行编程? [复制]

Posted

技术标签:

【中文标题】如何使用 Mockito 对 void 方法的行为进行编程? [复制]【英文标题】:How to program behavior of a void method with Mockito? [duplicate] 【发布时间】:2015-03-03 00:21:57 【问题描述】:

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

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

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

我的测试看起来像这样

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

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

编辑:更新问题

【问题讨论】:

列表是模拟对象的私有字段。为什么你关心它包含什么?看起来你希望模拟做它没有被模拟时会做的事情。 google "mockito void 方法",第一个结果 @JBNizet 实际上从技术上讲它是一个受保护的包级别。 Thoguh 我怀疑它在作者代码中实际上是这样使用的。 您似乎正试图将模拟用于与实际用途不同的目的。请你能解释一下你想测试什么? @Ray 为什么会这样?我将 Mockito 用于 Mockito 的设计目的。 【参考方案1】:

只需将此 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;
        
    

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

【讨论】:

这可能是我要找的,我会试试这个。 @Gobliins 我已经更新了答案以获得更完整的使用信息。【参考方案2】:

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

【讨论】:

不,这与我想做的相反。我不想调用真正的方法,那么我需要一个模拟吗?我想调用我自己的方法。如果您要替换 'when(mock.someMethod()).thenCallRealMethod();'通过'when(mock.someMethod()).thenCallMyCustomMethod();'那么这将是合乎逻辑的。

以上是关于如何使用 Mockito 对 void 方法的行为进行编程? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何断言使用 mockito 调用方法

如何在void方法中获取对象值SUT Mockito

怎么mockito方法的内部对象

Android单元测试之Mockito的使用

mockito在单元测试的使用一

带有 void 方法的 Mockito [重复]