这可能是一个概念上愚蠢的问题,但它也可能没有,因为我还是学生,我想我应该没问题。
想象一下,如果给定某些条件,它将抛出一个NumberFormatException。我想编写一个单元测试来查看异常是否正确。我怎样才能做到这一点?
P.S。我正在使用JUnit编写单元测试。
感谢。
答案 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 article和the ExpectedException JavaDoc
答案 3 :(得分:3)
@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机制中固有的一些缺点。