如果发生错误,则实际上会发生特殊情况。 如何进行测试以检查是否确实发生异常?
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'}";
}
}
答案 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。然后,您将期望您的生产代码返回该字符串。
如您所见,您需要“填充”很多东西:
最后:捕获NPE是一个非常糟糕的主意,并假定这意味着“未找到页面”。空指针就是这样:对null的引用。如果有的话,您的代码应检查某种情况才能得出结论“找不到页面”。发生NPE的原因很多。可能有一个代码错误,然后您去告诉客户“找不到页面”?!
因此,真正的答案是一个不同的答案:您应该退后一步,对如何进行适当的单元测试进行大量研究,也许使用Mockito之类的框架。然后,您将学习如何编写可以轻松测试的代码。如前所述:您编写的代码基本上无法测试。您最好解决此问题,而不是希望某个魔术框架可以帮助您解决代码库的内在问题。