JaCoCo分支机构覆盖资源尝试

时间:2016-12-26 17:43:33

标签: java junit bytecode jacoco

我有一种方法,我正在尝试进行单元测试。我无法发布实际代码,但它看起来像这样:

public int getTotal() throws MyException {
    int total = 0;
    try (ExternalResource externalResource = ExternalService.getResource()) {
        try (OtherExternal otherResource = externalResource.getOtherResource()) {
            if (someCondition) {
                total = otherResource.getTotal();
            }
        }
    }
}

JaCoCo告诉我,我在每个try-with-resource块上缺少4/8分支。我测试的是someCondition是真的,someCondition是假的,JaCoCo显示块完全覆盖。

我读了this question,我从接受的答案中理解,问题在于如何生成字节码。

我希望能够更好地理解如何识别生成的各个分支,然后我可以更好地判断是否测试它们(它们是否无法访问等)。

2 个答案:

答案 0 :(得分:1)

根据版本{0.8.2中的change history

  

javac 11为try-with-resources语句生成的分支和指令被过滤掉

我已经使用openjdk java8在本地进行了测试,而我的try-with-resources现在报告了100%的分支覆盖率(即使在测试中从未抛出IOException)。

虽然可以很好地测试此行为,但有时您无法轻松地重现此类异常。例如,在仅返回开放端口的方法中:

public int getOpenPort() {
    try (ServerSocket boundSocket = new ServerSocket(0)) {
        return boundSocket.getLocalPort();
    }
}

我知道没有一种简单的方法可以使此代码抛出IOException,而又不添加一堆混乱且不必要的复杂代码,仅通过分支覆盖率检查。幸运的是,新的(v0.8.2)jacoco库只需调用Assert.assertNotEquals(0, portChecker.getOpenPort());就可以通过一次测试为该方法提供100%的覆盖率。

答案 1 :(得分:-2)

您必须测试每个异常和每个条件。但JaCoCo有时未能正确识别所涵盖的内容。