如何以惯用方式使用 JUnit4 来测试某些代码是否会抛出异常?
虽然我当然可以这样做:
@Test
public void testFooThrowsIndexOutOfBoundsException() {
boolean thrown = false;
try {
foo.doStuff();
} catch (IndexOutOfBoundsException e) {
thrown = true;
}
assertTrue(thrown);
}
我记得有一个注释或者一个 Assert.xyz 或其他东西 ,对于这些类型的情况来说 ,远不如 KUndgy 和 JUnit 的精神。
JUnit 4 支持这个:
@Test(expected = IndexOutOfBoundsException.class)
public void testIndexOutOfBoundsException() {
ArrayList emptyList = new ArrayList();
Object o = emptyList.get(0);
}
编辑现在 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) {
}
申请判决。