public static <T extends Throwable> T assertThrows(Class <T> expectedType,Executable executable)断言所提供的可执行文件的执行会抛出expectedType的异常并返回异常 . 如果未引发异常,或者抛出了其他类型的异常,则此方法将失败 . 如果您不想对异常实例执行其他检查,只需忽略返回值 .
@Test
public void itShouldThrowNullPointerExceptionWhenBlahBlah() {
assertThrows(NullPointerException.class,
()->{
//do whatever you want to do here
//ex : objectName.thisMethodShoulThrowNullPointerExceptionForNullParameter(null);
});
}
@Test
public void convertIntoUpperCase_withInvalidInput_ExpectedExceptionRule() {
exception.expect(IllegalArgumentException.class);
exception.expectMessage("Empty value is passed.");
exceptionHandling.convertIntoUpperCase("");
}
9 回答
您可以使用assertThrows(),它允许您在同一测试中测试多个异常 . 在Java 8中支持lambdas,这是在JUnit中测试异常的规范方法 .
根据JUnit docs:
在Java 8和JUnit 5(Jupiter)中,我们可以声明异常,如下所示 . 使用
org.junit.jupiter.api.Assertions.assertThrows
该方法将使用
org.junit.jupiter.api
中的功能接口Executable
.参考:
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-
他们在JUnit 5中更改了它(预期:InvalidArgumentException,actual:invoked method),代码如下所示:
现在,Junit5提供了一种断言异常的方法
您可以测试一般例外和自定义例外
一般异常情况:
ExpectGeneralException.java
ExpectGeneralExceptionTest.java
您可以在此处找到测试CustomException的示例:assert exception code sample
ExpectCustomException.java
ExpectCustomExceptionTest.java
我认为这是一个更简单的例子
在包含空
ArrayList
的可选项上调用get()
将抛出NoSuchElementException
.assertThrows
声明预期的异常并提供lambda供应商(不接受任何参数并返回值) .感谢@prime的回答,我希望能够详细阐述 .
你可以使用
assertThrows()
. 我的例子取自文档http://junit.org/junit5/docs/current/user-guide/实际上我认为这个特定示例的文档中存在错误 . 预期的方法是expectThrows
有三种方法可以在Junit中声明某个异常 . 让我们为它编写单元测试用例 .
1. try-catch idiom 这个成语是最受欢迎的成语之一,因为它已经在JUnit 3中使用过 . 这种方法是一种常见的模式 . 当没有抛出异常并且在catch子句中验证异常本身时,测试将失败 .
2. @Test expected annotation 在这种方法中,我们在@Test中指定预期的异常,如下所示@Test(expected = IllegalArgumentException.class)
当没有抛出异常时,您将收到以下消息:java.lang.AssertionError:预期的异常:java.lang.IllegalArgumentException
使用这种方法,你需要小心 . 有时候很容易期待一般的Exception,RuntimeException甚至是Throwable . 这被认为是一种不好的做法,因为你的代码可能会在实际预期的其他地方抛出异常而你的测试仍然会通过!
这种方法的缺点之一是您无法断言异常消息 .
3. Junit @Rule 可以使用ExceptedException规则创建相同的示例 . 规则必须是标有@Rule注释的公共字段 .
我发现上面的代码更具可读性,因此我更喜欢使用这种方法 .
当没有抛出异常时,您将收到以下消息:java.lang.AssertionError:要抛出的预期测试(java.lang.IllegalArgumentException和异常的实例,并带有消息“传递空值 . ”) . 挺棒的 .
但不是我用上述方法检查的所有例外情况 . 有时我只需检查抛出的异常类型,然后使用@Test注释 .
这是一个简单的方法 .
只有在抛出您期望的异常时才会成功 .