Cobertura,如何覆盖从不会发生的catch-clause

时间:2014-02-20 11:53:43

标签: cobertura

我有雄心勃勃的目标,即在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();
    }

1 个答案:

答案 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块。