实际上,
@Test(expected=Xyz.class)在JUnit
4.7中有一个替代方法是使用
Rule和
ExpectedException
在测试用例中,您声明
ExpectedException带有
@Rule,并为其指定默认值
ExpectedException.none()。然后,在预期异常的测试中,将值替换为实际预期值。这样做的好处是,无需使用难看的try
/ catch方法,您就可以进一步指定异常中的消息是
@Rule public ExpectedException thrown= ExpectedException.none();@Testpublic void myTest() { thrown.expect( Exception.class ); thrown.expectMessage("Init Gold must be >= 0"); rodgers = new Pirate("Dread Pirate Rodgers" , -100);}使用此方法,您可能能够在通用异常中测试消息是否是特定的。
附加使用的
另一个优点
ExpectedException是,您可以在测试用例的上下文中更精确地确定异常的范围。如果仅
@Test(expected=Xyz.class)在测试中使用批注,则可以在测试代码中的任何位置引发Xyz异常-
包括测试方法中的任何测试设置或预声明。这可能导致误报。
使用ExpectedException,您可以推迟指定,
thrown.expect(Xyz.class)直到在任何设置和预声明之后才实际调用被测方法之前。因此,您可以更准确地确定实际方法调用而不是测试夹具本身抛出的异常的范围。
JUnit 5注:
的JUnit
5的JUnit木星除去
@Test(expected=...),
@Rule和
ExpectedException完全。它们被new替换
assertThrows(),这需要使用Java
8和lambda语法。
ExpectedException仍可通过JUnit Vintage在JUnit 5中使用。此外,JUnit
Jupiter也将
ExpectedException通过使用junit-jupiter-
migrationsupport模块继续支持JUnit
4
,但前提是您添加了附加的类级注释
@EnableRuleMigrationSupport。



