Mockito 的 @After 和 verifyNoMoreInteractions

CCC*_*CCC 5 java junit mockito

我想确保每个测试都验证与其模拟的所有交互,因此我只是添加了一个用 @After 注释的方法,并使用 verifyNoMoreInteractions 并将所有模拟作为参数。

@After
public void after(){
  verifyNoMoreInteractions(mock1,mock2,mock3,...)
}
Run Code Online (Sandbox Code Playgroud)

它有效,但如果交互发生在预期之外的地方,您如何知道哪个测试是有问题的?

ETO*_*ETO 3

你误用了方法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());
    }

}
Run Code Online (Sandbox Code Playgroud)

然后您可以在单元测试中使用它:

@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
    }

}
Run Code Online (Sandbox Code Playgroud)

该规则将应用于每次测试。