ExpectedException通过将整个测试方法通过JUnit
@Rule 包装在try-
catch块中来工作。当您的代码引发异常时,它将堆栈上移至最接近的try
/ catch,恰好在ExpectedException实例中(该实例检查您所期望的异常)。
在Java中,如果方法中发生未捕获的异常,则控制将永远不会在该方法的后面返回到语句。同样的规则也适用于此: 异常发生后,控件从不返回测试中的语句。
从技术上讲,您可以将验证放在最后一块,但这往往是个坏习惯。 编辑:
您的被测系统可能会引发意外的异常,或者根本没有异常,这将为您提供有用的故障消息和跟踪;但是,如果该失败导致您的验证或断言在该
finally块中失败,那么Java将显示该消息,而不是有关意外异常或意外成功的消息。这可能会使调试变得困难,尤其是因为您的错误将来自跟随错误根源的代码行,错误地暗示其上的代码成功。
如果您确实需要在异常之后验证状态,则可以按照方法在每个方法的基础上随时返回:
@Testpublic 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块中,以变得有用。我想对这种语法的支持将在许多标准测试库中找到。
assertThrows(MyException.class, () -> systemUnderTest.throwingMethod());



