测试异常时如何验证方法被调用

Mar*_*iam 1 java verify mockito

考虑以下代码:

@Rule ExpectedException expected = ExpectedException.none();
@Mock private MyObject mockMyObject;
private Converter converter; // Object under test

@Before public void before() {
    MockitoAnnotations.initMocks(this);
    when(mockMyObject.doSomething1()).thenReturn(1);
    when(mockMyObject.doSomething2()).thenReturn("2");
}

@After public void after() {
    verifyNoMoreInteractions(mockMyObject); // Exception test fails here
}

@Test public void testConverter() {
    assertThat(converter.convert(mockMyObject), notNullValue());
    verify(mockMyObject).doSomething1();
    verify(mockMyObject).doSomething2();
}

@Test public void testConverterException() {
    when(mockMyObject.doSomething1()).thenThrow(MyException.class);
    expected.expect(MyException.class);
    converter.convert(mockMyObject);
    verify(mockMyObject).doSomething1(); // Never gets called
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是,在异常测试中,标记我期望 doSomething1() 将被调用。然而,在 converter.convert() 处抛出异常,这意味着永远不会调用 verify() 调用。因此 verifyNoMoreInteractions() 在 after() 中失败。

注意:这是一个非常通用的示例,用于隐藏我们的任何内部代码。

Mar*_*iam 5

好的,德普。我发现与此类似的问题已经存在,简单的答案是:

@Test public void testConverterException() {
    when(mockMyObject.doSomething1()).thenThrow(MyException.class);
    expected.expect(MyException.class);
    try {
        converter.convert(mockMyObject);
    } finally {
        verify(mockMyObject).doSomething1(); // Now it gets called
    }
}
Run Code Online (Sandbox Code Playgroud)