在JUnit 5中是否有更好的方法断言方法抛出异常?
目前,我必须使用@Rule来验证我的测试是否抛出异常,但这不适用于我希望多个方法在测试中抛出异常的情况。
在JUnit 5中是否有更好的方法断言方法抛出异常?
目前,我必须使用@Rule来验证我的测试是否抛出异常,但这不适用于我希望多个方法在测试中抛出异常的情况。
当前回答
This is what I do when testing to make sure an exception has been thrown
//when
final var tripConsumer = new BusTripConsumer(inputStream);
final Executable executable = () -> tripConsumer.deserialiseTripData();
//then
assertThrows(IllegalArgumentException.class, executable);
其他回答
他们在JUnit 5中改变了它(预期:InvalidArgumentException,实际:invoked method),代码看起来像这样:
@Test
public void wrongInput() {
Throwable exception = assertThrows(InvalidArgumentException.class,
()->{objectName.yourMethod("WRONG");} );
}
This is what I do when testing to make sure an exception has been thrown
//when
final var tripConsumer = new BusTripConsumer(inputStream);
final Executable executable = () -> tripConsumer.deserialiseTripData();
//then
assertThrows(IllegalArgumentException.class, executable);
这里有一个简单的方法。
@Test
void exceptionTest() {
try{
model.someMethod("invalidInput");
fail("Exception Expected!");
}
catch(SpecificException e){
assertTrue(true);
}
catch(Exception e){
fail("wrong exception thrown");
}
}
它只有在抛出您期望的异常时才会成功。
TL;DR:如果您使用的是JUnit 5.8.0+版本,您可以使用assertThrowsExactly()而不是assertThrows()来匹配确切的异常类型。
assertThrowsExactly(FileNotFoundException.class, () -> service.blah());
您可以使用assertThrows(),但是使用assertThrows,即使抛出的异常是子类型,您的断言也将通过。
这是因为,JUnit 5通过调用Class.isInstance(..)来检查异常类型,即使抛出的异常是子类型,Class.isInstance(..)也会返回true。
解决方法是在Class上断言:
Throwable throwable = assertThrows(Throwable.class, () -> {
service.readFile("sampleFile.txt");
});
assertEquals(FileNotFoundException.class, throwable.getClass());
更简单的一行代码。使用Java 8和JUnit 5,本例不需要lambda表达式或花括号
import static org.junit.jupiter.api.Assertions.assertThrows;
@Test
void exceptionTesting() {
assertThrows(MyException.class, myStackObject::doStackAction, "custom message if assertion fails...");
// note, no parenthesis on doStackAction ex ::pop NOT ::pop()
}