我想确保每个测试都验证其模拟的所有交互,因此我只添加了一个以@After注释的方法,并带有一个verifyNoMoreInteractions并将所有模拟作为参数。
@After
public void after(){
verifyNoMoreInteractions(mock1,mock2,mock3,...)
}
它可以工作,但是如果在没有预期的交互作用下发生交互,那么您如何知道哪个测试是有问题的呢?
最佳答案
您正在滥用verifyNoMoreInteractions()
方法。您应该在每个要验证的测试中调用它。
另一方面,@After
应该用于清洁/关闭测试方法使用的资源。
您需要的是自定义TestWatcher
规则。请参阅以下此类规则的示例:
public class VerifyNoMoreInteractionsRule extends TestWatcher {
private final List<Object> mocks = new ArrayList<>();
public void add(Object mock){
mocks.add(mock);
}
@Override
protected void succeeded(Description description) {
verifyNoMoreInteractions(mocks.toArray());
}
}
然后,您可以在单元测试中使用它:
@RunWith(MockitoJUnitRunner.class)
public class VerifyTest {
@Rule
public VerifyNoMoreInteractionsRule noMoreInteractionsRule = new VerifyNoMoreInteractionsRule();
@Mock
private YourMock yourMock;
@Mock
private AnotherMock anotherMock;
@Before
public void setUp(){
// Register the mocks you want to verify after each test
noMoreInteractionsRule.add(yourMock);
noMoreInteractionsRule.add(anotherMock);
}
@Test
public void test(){
// Put your ordinary test code here
}
}
该规则将应用于每个测试。