如何检查JUnit中的异常处理?

时间:2019-05-15 11:01:00

标签: java

如果发生错误,则实际上会发生特殊情况。 如何进行测试以检查是否确实发生异常?

 private String getTemplate(String templateName) {
    try {
        FileReader reader = new FileReader(
                getClass().getClassLoader().getResource("templates/" 
                   + templateName).getFile()
        );
        StringBuilder templateString = new StringBuilder();

        char[] symbol = new char[256];
        int readBytes;
        while((readBytes = reader.read(symbol)) > 0)
            for (int i = 0; i < readBytes; i++)
                templateString.append(symbol[i]);

        return templateString.toString();
    } catch (NullPointerException e) {
        e.printStackTrace();
        return "{'detail': 'internal server error: page not found'}";
    }  catch (IOException e) {
        e.printStackTrace();
        return "{'detail': 'internal server error: page cannot be read'}";
    }
}

1 个答案:

答案 0 :(得分:2)

基本上,您的问题是您编写了难以测试的代码

    FileReader reader = new FileReader(
            getClass().getClassLoader().getResource("templates/" 
               + templateName).getFile()

对new的调用基本上可以转换为:如果需要,则需要PowerMock(ito)或JMockit来控制生产代码。

您可以做的是:传递一个FileReader对象到该方法,以便它仅在该对象上调用method。然后,您可以使用Mockito为该代码提供一个 mocked FileReader。这样,您就可以控制测试生产代码时发生的情况。

然后您可以执行以下操作:

@Test
public void testNPE() {
  Mockito.when(mockedFileReader.read(ArgumentsMatcher.any())).thenThrow(new NullPointerException("haha"));
  String result = objectUnderTest.callAPublicMethodThatCallsTheMethodUnderTest(foo);

  assertThat(result, is("{'detail': 'internal server error: page not found'}");
  }

以上内容指示模拟文件阅读器在调用其read()方法时抛出NPE。然后,您将期望您的生产代码返回该字符串。

如您所见,您需要“填充”很多东西:

  • 您不能调用私有方法,因此很明显,您必须为被测类调用一个公共入口点
  • 仅当从私有方法中出来的字符串以某种方式出现在该公共方法的响应中时,它才起作用
  • ,并且说:以某种方式的模拟文件阅读器需要将插入 objectUnderTest

最后:捕获NPE是一个非常糟糕的主意,并假定这意味着“未找到页面”。空指针就是这样:对null的引用。如果有的话,您的代码应检查某种情况才能得出结论“找不到页面”。发生NPE的原因很多。可能有一个代码错误,然后您去告诉客户“找不到页面”?!

因此,真正的答案是一个不同的答案:您应该退后一步,对如何进行适当的单元测试进行大量研究,也许使用Mockito之类的框架。然后,您将学习如何编写可以轻松测试的代码。如前所述:您编写的代码基本上无法测试。您最好解决此问题,而不是希望某个魔术框架可以帮助您解决代码库的内在问题。