如何处理在JUnit异常(how to handle exceptions in junit)

2019-09-03 20:37发布

我写了一些测试用例来测试一些方法。 但一些方法抛出异常。 我在做正确吗?

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);
}

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

Answer 1:

意外的异常是一个测试失败,所以你不需要也不想要捉住一个。

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

直到service不会抛出IllegalArgumentException因为str中有一个小数点,这将是一个简单的测试失败。

预期异常应通过可选的处理expected的参数@Test

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

如果程序员是懒惰和扔Exception ,或者如果他service回报0.0 ,测试将失败。 只有一个NPE会成功。 需要注意的是期望的异常的子类也行。 这是罕见的NPE S,但常见的有IOException S和SQLException秒。

在要测试特定异常消息极少数情况下,您可以使用新望ExpectedException JUnit的@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抛出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 ; 现在,它并没有太大的帮助。 你可以变成一个参数化的测试类此。



Answer 2:

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

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

Junit认为失败的测试会抛出异常,你抓住他们只是从能够正确地报告他们停止JUnit的。 同样这样的@Test标注的预期属性将正常工作。



Answer 3:

你并不需要捕获该异常失败的考验。 就随它去吧(通过声明throws ),它无论如何都会失败。

另一种情况是当你真正所期望的异常,那么您将无法在try块的结尾。

例如:

@Test
public void testInvalidNumber() {
  try {
      String dummy = service.convert(-1));
      Assert.fail("Fail! Method was expected to throw an exception because negative numbers are not supported.")
  } catch (OutOfRangeException e) {
      // expected
  }
}

您可以使用这种测试来验证,如果你的代码是正确的验证输入和处理无效的输入与适当的异常。



Answer 4:

有几个策略,是向你敞开,以应对你的测试预期的例外。 我觉得JUnit标注和try / catch成语已经如上所述。 我想提请注意Lambda表达式在Java 8选项。

比如给定:

class DummyService {
public void someMethod() {
    throw new RuntimeException("Runtime exception occurred");
}

public void someOtherMethod(boolean b) {
    throw new RuntimeException("Runtime exception occurred",
            new IllegalStateException("Illegal state"));
}

}

你可以这样做:

@Test
public void verifiesCauseType() {
    // lambda expression
    assertThrown(() -> new DummyService().someOtherMethod(true))
            // assertions
            .isInstanceOf(RuntimeException.class)
            .hasMessage("Runtime exception occurred")
            .hasCauseInstanceOf(IllegalStateException.class);
}

看看这个博客里面涵盖了大部分的结合实例的选项。

http://blog.codeleak.pl/2013/07/3-ways-of-handling-exceptions-in-junit.html

而这一次更充分地解释了Java 8 LAMBDA选项:

http://blog.codeleak.pl/2014/07/junit-testing-exception-with-java-8-and-lambda-expressions.html



文章来源: how to handle exceptions in junit