测试异常时如何验证方法是否被调用
How to verify a method was called, when testing an exception
考虑以下代码:
@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
}
我希望能够做的是,在异常测试中,标记我希望调用 doSomething1()。但是,异常会在 converter.convert() 处抛出,这意味着永远不会调用 verify() 调用。因此 verifyNoMoreInteractions() 在 after() 中失败。
注意:这是一个非常通用的示例,用于隐藏我们的任何内部代码。
好的,笨蛋。我发现与此类似的问题已经存在,简单的答案是:
@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
}
}
考虑以下代码:
@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
}
我希望能够做的是,在异常测试中,标记我希望调用 doSomething1()。但是,异常会在 converter.convert() 处抛出,这意味着永远不会调用 verify() 调用。因此 verifyNoMoreInteractions() 在 after() 中失败。
注意:这是一个非常通用的示例,用于隐藏我们的任何内部代码。
好的,笨蛋。我发现与此类似的问题已经存在,简单的答案是:
@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
}
}