使用Spring Boot的@MockBean时创建严格的模拟?

Posted

技术标签:

【中文标题】使用Spring Boot的@MockBean时创建严格的模拟?【英文标题】:Creating strict mock when using @MockBean of spring boot? 【发布时间】:2017-06-17 23:17:32 【问题描述】:

我使用弹簧靴的@MockBean(使用@RunWith(SpringRunner.class)),到目前为止一切正常。 然而,模拟为模拟类的每个方法提供了默认实现,因此我无法检查是否只调用了我希望调用的那些方法,即我想创建严格的模拟。@MockBean 可以吗?

如果有人知道如何检查是否只有我期望的那些方法被调用,我不会坚持创建严格的模拟。

提前感谢您的帮助!

问候, 五、

【问题讨论】:

【参考方案1】:

使用 Mockito,您可以验证是否调用了方法:

verify(mockOne).add("one");

或者它从未被调用过(never() 是 times(0) 的更易读的别名):

verify(mockOne, never()).remove("two");

或者您可以验证 没有调用其他方法

verify(mockOne).add("one"); // check this one
verifyNoMoreInteractions(mockOne); // and nothing else

有关详细信息,请参阅Mockito documentation。

【讨论】:

哦,我喜欢verifyNoMoreInteractionsverifyZeroInteractions,他们会的!谢谢!【参考方案2】:

您可以对由@Mockbean 创建的模拟对象使用 Mockito.verify 方法。 它可以检查它调用了多少次,指定了什么参数,等等。 请尝试一下。

【讨论】:

感谢您的回复!那我也可以用times(0) 写吗?还有一件事我不必用times(0)检查所有方法吗? 是的,你可以做到。 对不起,我还没读完最后一句话。尝试使用 verifyZeroInteractions。我从来没用过。

以上是关于使用Spring Boot的@MockBean时创建严格的模拟?的主要内容,如果未能解决你的问题,请参考以下文章

使用 @MockBean 的 Spring Boot 集成测试不释放 jdbc 连接

@MockBean 不适用于带有 JUnit 5 和 Spring Boot 2 的 @WebMvcTest?

为啥弹簧测试失败,不起作用@MockBean

spring单元测试Mock,MockBean踩坑及没有真实执行的理解

Spring Boot Test Mockito Mock Void Return,无返回值的方法

SpringJunitTest