使用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。
【讨论】:
哦,我喜欢verifyNoMoreInteractions
和verifyZeroInteractions
,他们会的!谢谢!【参考方案2】:
您可以对由@Mockbean 创建的模拟对象使用 Mockito.verify 方法。 它可以检查它调用了多少次,指定了什么参数,等等。 请尝试一下。
【讨论】:
感谢您的回复!那我也可以用times(0)
写吗?还有一件事我不必用times(0)
检查所有方法吗?
是的,你可以做到。
对不起,我还没读完最后一句话。尝试使用 verifyZeroInteractions。我从来没用过。以上是关于使用Spring Boot的@MockBean时创建严格的模拟?的主要内容,如果未能解决你的问题,请参考以下文章
使用 @MockBean 的 Spring Boot 集成测试不释放 jdbc 连接
@MockBean 不适用于带有 JUnit 5 和 Spring Boot 2 的 @WebMvcTest?
spring单元测试Mock,MockBean踩坑及没有真实执行的理解