在Java中断言异常,如何?

时间:2010-10-28 21:56:51

标签: java unit-testing exception-handling junit

这可能是一个概念上愚蠢的问题,但它也可能没有,因为我还是学生,我想我应该没问题。

想象一下,如果给定某些条件,它将抛出一个NumberFormatException。我想编写一个单元测试来查看异常是否正确。我怎样才能做到这一点?

P.S。我正在使用JUnit编写单元测试。

感谢。

7 个答案:

答案 0 :(得分:30)

正如其他海报所说,如果您使用的是JUnit4,那么您可以使用注释:

@Test(expected=NumberFormatException.class);

但是,如果您使用的是旧版本的JUnit,或者如果您想在同一测试方法中执行多个“异常”断言,则标准惯用语是:

try {
   formatNumber("notAnumber");
   fail("Expected NumberFormatException");
catch(NumberFormatException e) {
  // no-op (pass)
}

答案 1 :(得分:10)

假设您正在使用JUnit 4,请以导致它抛出异常的方式调用测试中的方法,并使用JUnit注释

@Test(expected = NumberFormatException.class)

如果抛出异常,测试将通过。

答案 2 :(得分:8)

如果您可以使用JUnit 4.7,则可以使用ExpectedException规则

@RunWith(JUnit4.class)
public class FooTest {
  @Rule
  public ExpectedException exception = ExpectedException.none();

  @Test
  public void doStuffThrowsIndexOutOfBoundsException() {
    Foo foo = new Foo();

    exception.expect(IndexOutOfBoundsException.class);
    exception.expectMessage("happened?");
    exception.expectMessage(startsWith("What"));
    foo.doStuff();
  }
}

这比@Test(expected=IndexOutOfBoundsException.class)要好得多,因为如果在IndexOutOfBoundsException之前抛出foo.doStuff(),测试将会失败

有关详细信息,请参阅this articlethe ExpectedException JavaDoc

答案 3 :(得分:3)

You can do this

 @Test(expected=IndexOutOfBoundsException.class)
    public void testIndexOutOfBoundsException() {
        ArrayList emptyList = new ArrayList();
        Object o = emptyList.get(0);
    }

答案 4 :(得分:2)

使用@Test(expected = IOException.class)

http://junit.sourceforge.net/doc/faq/faq.htm#tests_7

如果您有一个预期的异常,这很好。另一种策略是在测试方法的末尾添加Assert.fail()。如果未抛出异常,则测试将相应失败。 e.g。

@Test
public void testIOExceptionThrown() {      
   ftp.write(); // will throw IOException      
   fail();
}

答案 5 :(得分:1)

在测试方法之前添加此注释;它会起作用。

@Test(expected = java.lang.NumberFormatException.class)
public void testFooMethod() {
    // Add code that will throw a NumberFormatException
}

答案 6 :(得分:0)

catch-exception提供了一个未绑定到特定JUnit版本的解决方案,该解决方案旨在克服JUnit机制中固有的一些缺点。