繁体   English   中英

JaCoCo分支机构覆盖范围尝试使用资源

[英]JaCoCo branch coverage try with resources

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

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

JaCoCo告诉我,我在每个带资源尝试块上都缺少4/8个分支。 我正在测试someCondition为true,someCondition为false,JaCoCo显示该块已完全覆盖。

我读了这个问题 ,并从接受的答案中了解到问题在于字节码的生成方式。

我希望能够更好地了解如何识别所生成的各种分支,然后就是否测试它们(它们是否无法访问等)做出更好的判断。

根据版本0.8.2中的更改历史记录

由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%的覆盖率Assert.assertNotEquals(0, portChecker.getOpenPort());

您必须测试每个异常和每个条件。 但是JaCoCo有时无法正确识别覆盖或不覆盖的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM