我有雄心勃勃的目标,即在cobertura获得100%的测试覆盖率。如何在此代码上实现此目的?永远不会有异常,因为该文件位于类路径中。我可以用junit删除文件fropm classpath吗?
try {
InputStreamReader reader = new InputStreamReader(WsdlSource.class.getClassLoader().getResourceAsStream("stringresources/stringresources.properties"), "UTF-8");
try {
p.load(reader);
} finally {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
答案 0 :(得分:1)
首先,为了能够正确测试,您必须了解loose coupling是什么以及Mock Objects是什么。
基本上,使用new
创建对象绝不是一个好主意,因为您在类InputStreamReader
和逻辑之间创建了一个硬依赖。
如果您的对象p
实现了某种接口,那么从逻辑外部传递它的实例会更好。模拟对象的一些实现也允许你模拟一个类,但我不建议这样做。
例如,如果您编写代码:
public myMethod(SomeKindOfInterface p, InputStreamReader reader) {
try {
p.load(reader);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
reader.close();
} catch(IOException e) {
//intentionally left blank, nothing could be done upon exception on closing
}
}
}
然后在您的JUnit中,您可以使用Mockito来模拟IOException
。
InputStreamReader reader = new InputStreamReader(WsdlSource.class.getClassLoader().getResourceAsStream("stringresources/stringresources.properties"), "UTF-8");
SomeKindOfInterface mock = Mockito.mock(SomeKindOfInterface.class);
Mockito.when(mock.load(reader)).thenThrow(new IOException());
myInstance.myMethod(mock, reader);
通过这种方式,您可以覆盖catch
块。