首页 > 解决方案 > 如何验证仅在一个测试范围内没有在模拟上调用方法?

问题描述

我知道我可以verify(mock, times(0)).methodCall(),并且当我单独运行我的一项测试时,这很有效。问题是文件中的其他测试与此方法有交互,当我运行文件中的所有测试时,我得到一个异常org.mockito.exceptions.verification.NeverWantedButInvoked:,因为另一个测试与模拟有交互。

有没有办法限制verify()只计算一个测试方法范围内的交互次数,而不是计算文件中所有测试的交互?

标签: javatestingmockito

解决方案


通常的模式是:为每个测试用例创建一个新的模拟。

以 JUnit 和 Mockito 为例,它可能看起来像这样:

@RunWith(MockitoJUnitRunner.class)
public class FooTest {
  @Mock 
  Bar mockedBar;
  ...

这样做将为您的每个 @Test 方法创建一个的模拟实例。当您遵循这种做法时,无需担心“交叉测试用例”调用。因为每个测试都使用其“自己的”模拟。

或者反过来:避免为多个测试“重复使用”相同的模拟对象。

并且要明确一点:模拟对象不知道那个“测试方法上下文”。他们在某个时候创建​​,然后发生方法调用。模拟不关心或知道这些呼叫来自“哪里”。


推荐阅读