尝试在 JUnit 测试中捕获

2022-08-31 15:20:07

我正在为一个已经存在很长时间的应用程序编写单元测试。我需要测试的一些方法是这样的:

public void someMethod() throws Exception { 
   //do something 
}

如果我想测试这些方法,我必须在我的单元测试中写这样的东西:

@Test
public void someTest() {
   try {
      someMethod();
   }
   catch (Exception e) {
      e.printStackTrace();
   }
}

这样做是一种好的做法吗?还是有其他方法来测试这些方法?

我在互联网上做了一些研究,我发现了一些带有注释和的解决方案,但这不起作用(Eclipse一直将测试中的行显示为错误)。我不知道这些是否是很好的解决方案,因为我对整个单元测试故事很陌生。@Rule@Test(expected=Exception.class)someMethod()

如果对此了解很多的人可以帮助我,我会非常感激。


答案 1

由于 是已检查的异常,因此您可以:Exception

  • 必须捕获语句中的异常,或者try...catch
  • 声明要在方法本身中引发的异常。

你在那里的东西工作正常,但我个人倾向于声明要抛出的异常。这样,如果在测试运行期间引发我不希望的异常,则测试将失败

@Test
public void someTest() throws Exception {
    // dodgy code here
}

如果我们需要查看是否引发特定异常,则可以选择直接使用或将值添加到注释中。@Rule@Test

@Test(expected = FileNotFoundException.class)
public void someTest() throws Exception {
    // dodgy code here
}

在 JUnit 5 中,您可以利用 Assertions.assertThrows 来完成相同的操作。总的来说,我对此不太熟悉,因为它在编辑时还不是GA,但它似乎接受了来自JUnit 5的一个。Executable

@Test
public void someTest() {
    assertThrows(FileNotFoundException.class, () ->
         { dodgyService.breakableMethod() };
}

答案 2
@Test
public void someTest() {
   try {
     someMethod();
   }
   catch (Exception e) {
     Assert.fail("Exception " + e);
   }
}

如果不应该发生异常,您可以执行的操作。另一种方法是在签名中引发异常,如下所示:

@Test
public void someTest() throws Exception {
     someMethod();
}

不同之处在于,在一种情况下,测试将失败并显示断言异常,而在另一种情况下,它将失败,因为测试崩溃。(就像在你的代码中的某个地方,你会得到一个NPE,测试会因此而得到)

您必须执行此操作的原因是因为异常是已检查的异常。请参阅选中与未选中的异常

@Test(expected=Exception.class) 用于测试是否将引发异常的测试。

@Test(expected=ArrayIndexOutOfBounds.class)
public void testIndex() {
   int[] array = new int[0];
   int var = array[0]; //exception will be thrown here, but test will be green, because we expect this exception

}

推荐