[英]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.