在JUnit 5中是否有更好的方法断言方法抛出异常?
目前,我必须使用@Rule来验证我的测试是否抛出异常,但这不适用于我希望多个方法在测试中抛出异常的情况。
在JUnit 5中是否有更好的方法断言方法抛出异常?
目前,我必须使用@Rule来验证我的测试是否抛出异常,但这不适用于我希望多个方法在测试中抛出异常的情况。
当前回答
更简单的一行代码。使用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()
}
其他回答
他们在JUnit 5中改变了它(预期:InvalidArgumentException,实际:invoked method),代码看起来像这样:
@Test
public void wrongInput() {
Throwable exception = assertThrows(InvalidArgumentException.class,
()->{objectName.yourMethod("WRONG");} );
}
更简单的一行代码。使用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()
}
实际上,我认为这个特殊例子的文档中有一个错误。预期的方法是expectThrows
public static void assertThrows(
public static <T extends Throwable> T expectThrows(
现在Junit5提供了一种断言异常的方法
您可以测试常规异常和定制异常
一般的异常场景:
ExpectGeneralException.java
public void validateParameters(Integer param ) {
if (param == null) {
throw new NullPointerException("Null parameters are not allowed");
}
}
ExpectGeneralExceptionTest.java
@Test
@DisplayName("Test assert NullPointerException")
void testGeneralException(TestInfo testInfo) {
final ExpectGeneralException generalEx = new ExpectGeneralException();
NullPointerException exception = assertThrows(NullPointerException.class, () -> {
generalEx.validateParameters(null);
});
assertEquals("Null parameters are not allowed", exception.getMessage());
}
您可以在这里找到一个测试CustomException的示例:断言异常代码示例
ExpectCustomException.java
public String constructErrorMessage(String... args) throws InvalidParameterCountException {
if(args.length!=3) {
throw new InvalidParameterCountException("Invalid parametercount: expected=3, passed="+args.length);
}else {
String message = "";
for(String arg: args) {
message += arg;
}
return message;
}
}
ExpectCustomExceptionTest.java
@Test
@DisplayName("Test assert exception")
void testCustomException(TestInfo testInfo) {
final ExpectCustomException expectEx = new ExpectCustomException();
InvalidParameterCountException exception = assertThrows(InvalidParameterCountException.class, () -> {
expectEx.constructErrorMessage("sample ","error");
});
assertEquals("Invalid parametercount: expected=3, passed=2", exception.getMessage());
}
在Java 8和JUnit 5 (Jupiter)中,我们可以这样断言异常。 使用org.junit.jupiter.api.Assertions.assertThrows
public static < T extends Throwable > T assertThrows(类< T > expectedType, 可执行可执行) 断言所提供的可执行文件的执行将抛出expectedType的异常并返回该异常。 如果没有抛出异常,或者抛出了不同类型的异常,则此方法将失败。 如果您不想对异常实例执行额外的检查,只需忽略返回值。
@Test
public void itShouldThrowNullPointerExceptionWhenBlahBlah() {
assertThrows(NullPointerException.class,
()->{
//do whatever you want to do here
//ex : objectName.thisMethodShoulThrowNullPointerExceptionForNullParameter(null);
});
}
该方法将使用org.junit.jupiter.api中的函数接口可执行文件。
参考:
http://junit.org/junit5/docs/current/user-guide/#writing-tests-assertions http://junit.org/junit5/docs/5.0.0-M2/api/org/junit/jupiter/api/Executable.html http://junit.org/junit5/docs/5.0.0-M4/api/org/junit/jupiter/api/Assertions.html#assertThrows-java.lang.Class-org.junit.jupiter.api.function.Executable-