如何惯用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); }
现在已经发布了JUnit 5和JUnit 4.13,最好的选择是使用Assertions.assertThrows() (对于JUnit 5)和Assert.assertThrows()(对于JUnit 4.13)。请参阅我的其他答案以获取详细信息。
JUnit 5
Assert.assertThrows()
如果尚未迁移到JUnit 5,但可以使用JUnit 4.7,则可以使用ExpectedExceptionRule:
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)因为如果IndexOutOfBoundsException之前抛出测试,测试将失败foo.doStuff()
@Test(expected=IndexOutOfBoundsException.class)
IndexOutOfBoundsException
foo.doStuff()