您如何断言在 JUnit 测试中会引发某个异常?

2022-08-31 01:25:09

我如何习惯性地使用JUnit来测试某些代码是否引发异常?

虽然我当然可以做这样的事情:

@Test
public void testFooThrowsIndexOutOfBoundsException() {
  boolean thrown = false;

  try {
    foo.doStuff();
  } catch (IndexOutOfBoundsException e) {
    thrown = true;
  }

  assertTrue(thrown);
}

我记得有一个注释或一个 Assert.xyz 或一些东西,对于这些情况,它远没有那么笨拙,更符合JUnit的精神。


答案 1

这取决于 JUnit 版本以及您使用的断言库。

最初的答案是:JUnit <= 4.12

@Test(expected = IndexOutOfBoundsException.class)
public void testIndexOutOfBoundsException() {

    ArrayList emptyList = new ArrayList();
    Object o = emptyList.get(0);

}

虽然答案 https://stackoverflow.com/a/31826781/2986984 对JUnit有更多的选择<= 4.12。

参考:


答案 2

编辑:现在 JUnit 5 和 JUnit 4.13 已经发布,最好的选择是使用 Assertions.assertThrows() (对于 JUnit 5) 和 Assert.assertThrows() (对于 JUnit 4.13+)。有关详细信息,请参阅我的其他答案

如果您尚未迁移到 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)IndexOutOfBoundsExceptionfoo.doStuff()

有关详细信息,请参阅此文章