你如何断言在JUnit 4测试中引发了某种异常?
我如何通过惯用方式使用JUnit4来测试某些代码是否会抛出异常?
虽然我当然可以做这样的事情:
@Test
public void testFooThrowsIndexOutOfBoundsException() {
boolean thrown = false;
try {
foo.doStuff();
} catch (IndexOutOfBoundsException e) {
thrown = true;
}
assertTrue(thrown);
}
我记得有一个注释或一个Assert.xyz或者其他一些远远不够灵活的东西,而且在这种情况下JUnit的精神远不止于此。
JUnit 4支持这一点:
@Test(expected = IndexOutOfBoundsException.class)
public void testIndexOutOfBoundsException() {
ArrayList emptyList = new ArrayList();
Object o = emptyList.get(0);
}
参考:https://junit.org/junit4/faq.html#atests_7
编辑现在JUnit5已经发布,最好的选择是使用Assertions.assertThrows()
(请参阅我的其他答案)。
如果您尚未迁移到JUnit 5,但可以使用JUnit 4.7,则可以使用ExpectedException
规则:
public class FooTest {
@Rule
public final ExpectedException exception = ExpectedException.none();
@Test
public void doStuffThrowsIndexOutOfBoundsException() {
Foo foo = new Foo();
exception.expect(IndexOutOfBoundsException.class);
foo.doStuff();
}
}
这比@Test(expected=IndexOutOfBoundsException.class)
要好得多,因为如果在foo.doStuff()
之前抛出IndexOutOfBoundsException
则测试将失败。
详情请参阅这篇文章
小心使用预期的异常,因为它只声明该方法抛出该异常,而不是测试中的特定代码行 。
我倾向于使用它来测试参数验证,因为这些方法通常非常简单,但更复杂的测试可能更适合于:
try {
methodThatShouldThrow();
fail( "My method didn't throw when I expected it to" );
} catch (MyException expectedException) {
}
应用判断。
链接地址: http://www.djcxy.com/p/14337.html上一篇: How do you assert that a certain exception is thrown in JUnit 4 tests?
下一篇: The difference between Web deploy and FTP deploy in Visual studio?