如何处理 junit 中的异常

我写了一些测试用例来测试一些方法。但某些方法会引发异常。我做得对吗?

private void testNumber(String word, int number) {
    try {
        assertEquals(word,  service.convert(number));
    } catch (OutOfRangeNumberException e) {
        Assert.fail("Test failed : " + e.getMessage());
    }
}

@Test
public final void testZero() {
    testNumber("zero", 0);
}

如果我通过,它将失败,但我无法测试特定的异常,如-45OutOfRangeException@Test(Expected...)


答案 1

意外的异常是测试失败,因此您既不需要也不想捕获一个。

@Test
public void canConvertStringsToDecimals() {
    String str = "1.234";
    Assert.assertEquals(1.234, service.convert(str), 1.0e-4);
}

直到不抛出一个因为里面有一个小数点,那将是一个简单的测试失败。serviceIllegalArgumentExceptionstr

预期的异常应由 可选参数 处理。expected@Test

@Test(expected=NullPointerException.class)
public void cannotConvertNulls() {
    service.convert(null);
}

如果程序员懒惰并抛出,或者如果他返回,测试将失败。只有意志才能成功。请注意,预期异常的子类也有效。这对于 s 来说很少见,但在 s 和 s 中很常见。Exceptionservice0.0NPENPEIOExceptionSQLException

在极少数情况下,如果要测试特定的异常消息,请使用 newish JUnit 。ExpectedException@Rule

@Rule
public ExpectedException thrown= ExpectedException.none();
@Test
public void messageIncludesErrantTemperature() {
    thrown.expect(IllegalArgumentException.class);
    thrown.expectMessage("-400"); // Tests that the message contains -400.
    temperatureGauge.setTemperature(-400);
}

现在,除非 setTemperature 引发 a,并且消息包含用户尝试设置的温度,否则测试将失败。此规则可以以更复杂的方式使用。IAE


您的示例可以通过以下方式进行最佳处理:

private void testNumber(String word, int number)
        throws OutOfRangeNumberException {
    assertEquals(word,  service.convert(number));
}

@Test
public final void testZero()
        throws OutOfRangeNumberException {
    testNumber("zero", 0);
}

您可以内联 ;现在,它没有多大帮助。您可以将其转换为参数化测试类。testNumber


答案 2

删除 try-catch 块并添加到测试方法中,例如:throws Exception

@Test
public final void testZero() throws Exception {
    assertEquals("zero",  service.convert(0));
}

JUnit 预计失败的测试会引发异常,您捕获它们只是阻止 JUnit 正确报告它们。同样,这样,@Test注释上的预期属性将起作用。


推荐