你如何断言在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?