ExpectedException通过
JUnit @Rule在try-catch块中通过
wrapping your entire test method工作。当你的代码抛出一个异常时,它将堆栈上升到最近的try / catch,它恰好在ExpectedException实例中(它检查它是异常“期待)。
在Java中,如果在方法中发生未捕获的异常,控件将永远不会返回到该方法中稍后的语句。相同的规则适用于此:控制从不返回到异常后的测试中的语句。
从技术上来说,你可以把验证放在finally块中,但是这往往是a bad habit.在任何情况下,它可能会吞下有用的ExpectedException消息,因为它将在ExpectedException规则可以拦截之前运行。
如果你真的需要在异常后验证状态,在每个方法的基础上,你总是可以回到这个成语:
@Test
public void testExpectedException()
{
MockedObject mockObj = mock(MockedObj.class);
MySubject subject = new MySubject(mockedObj);
try {
subject.someMethodThrowingException();
fail("Expected MyException.");
} catch (MyException expected) {
assertEquals("My exception message.", expected.getMessage());
}
verify(mockObj).someCleanup(eq(...));
}
更新:使用Java 8的lambda表达式,您可以在try块concisely enough to be useful中包装一个功能接口调用。我认为支持这种语法将进入许多标准测试库。
assertThrows(MyException.class,
() -> systemUnderTest.throwingMethod());