如果发生错误,则实际上会发生特殊情况。如何进行测试,以便检查出一个例外吗?
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'}";
}
}
基本上您的问题是您写了很难测试代码:
FileReader reader = new FileReader(
getClass().getClassLoader().getResource("templates/"
+ templateName).getFile()
此呼叫基本上转化为:如果有的话,您需要PowerMock(ITO(或JMOCKIT才能获得对生产代码的控制。
您可以做什么: Pass 将fileReader对象到该方法,以便它在该对象上只调用方法。然后,您可以使用Mockito将A 模拟 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'}");
}
上面的指示嘲笑文件读取器在调用npe时抛出了npe。然后,您希望您的生产代码返回该字符串。
如您所见,您必须"填充"很多事情:
- 您无法调用私人方法,因此,很明显,您必须将公共入口点调用到您的班级正在测试
- 仅当从私人方法中出来的字符串以某种方式出现在该公共方法的响应中 以某种方式出现
- 和,如说:某种程度上模拟文件阅读器需要将纳入 objectunder -test
最后:抓住NPE是一个非常糟糕的主意,并假定这意味着"找不到页面"。无效指针就是这样:对空的引用。如果有的话,您的代码应检查一些条件,以得出结论"找不到页面"。NPE可能出于多种原因而发生。可能会有一个代码错误,然后您去告诉客户"找不到页面"?!
因此,真正的答案是不同的答案:您应该退后一步,进行大量研究如何进行适当的单元测试,也许是使用Mockito之类的框架。然后,您将学习如何编写可以轻松测试的代码。如所说:您编写的代码基本上是无法测试的。您最好解决这个问题,而不是希望某些魔术框架可以帮助您解决代码基础的固有问题。