powermockito - 测试异常处理
powermockito - testing exception handling
测试截图:
void somefunction() {
try {
aMock.doSomething();
bMock.another();
} finally {
cMock.cleanup();
}
}
测试:
@Test(expected = Exception.class)
void sometest() {
... setup various mocks ...
PowerMockito.doThrow(new Exception("abc")).when(aMock).doSomething();
outerMock.somefunction();
// ** THIS SHOULD FAIL
verify(bMock).another();
// ** THIS SHOULD FAIL TOO
verify(cMock, never()).cleanup()
}
当我运行这个它通过了。为什么?抛出异常(和@Test 中的处理)是否胜过 verify 语句?
如果是这样 - 是否有某种方法可以测试 finally 子句是否已执行?
因为抛出了异常(真的),你的函数代码下的一切都是死代码。
outerMock.somefunction(); // throw so, this is the end
// ------- dead code blow:
// ** THIS SHOULD FAIL
verify(bMock).another();
// ** THIS SHOULD FAIL TOO
verify(cMock, never()).cleanup()
因此,要测试 finally 块,您必须使用正常执行(当没有发生异常时)。另一种解决方案是在测试中使用 try/catch:
try {
outerMock.somefunction();
fail("was expecting an exception..");
} catch(Exception exception) {
// ignore
}
verify(bMock).another();
verify(cMock, never()).cleanup()
回答评论中的问题:
假设现在的代码是:
void somefunction() {
try {
aMock.doSomething();
bMock.another();
} catch(Exception ex) {
cMock.handleException(ex);
}
}
测试可以是:
Exception testEx = new Exception("testing")
Mockito.when(aMock.doSomething()).thenThrow(testEx);
instance.somefunction();
Mockito.verify(cMock).handleException(testEx);
测试截图:
void somefunction() {
try {
aMock.doSomething();
bMock.another();
} finally {
cMock.cleanup();
}
}
测试:
@Test(expected = Exception.class)
void sometest() {
... setup various mocks ...
PowerMockito.doThrow(new Exception("abc")).when(aMock).doSomething();
outerMock.somefunction();
// ** THIS SHOULD FAIL
verify(bMock).another();
// ** THIS SHOULD FAIL TOO
verify(cMock, never()).cleanup()
}
当我运行这个它通过了。为什么?抛出异常(和@Test 中的处理)是否胜过 verify 语句?
如果是这样 - 是否有某种方法可以测试 finally 子句是否已执行?
因为抛出了异常(真的),你的函数代码下的一切都是死代码。
outerMock.somefunction(); // throw so, this is the end
// ------- dead code blow:
// ** THIS SHOULD FAIL
verify(bMock).another();
// ** THIS SHOULD FAIL TOO
verify(cMock, never()).cleanup()
因此,要测试 finally 块,您必须使用正常执行(当没有发生异常时)。另一种解决方案是在测试中使用 try/catch:
try {
outerMock.somefunction();
fail("was expecting an exception..");
} catch(Exception exception) {
// ignore
}
verify(bMock).another();
verify(cMock, never()).cleanup()
回答评论中的问题:
假设现在的代码是:
void somefunction() {
try {
aMock.doSomething();
bMock.another();
} catch(Exception ex) {
cMock.handleException(ex);
}
}
测试可以是:
Exception testEx = new Exception("testing")
Mockito.when(aMock.doSomething()).thenThrow(testEx);
instance.somefunction();
Mockito.verify(cMock).handleException(testEx);