我有一种方法,我正在尝试进行单元测试。我无法发布实际代码,但它看起来像这样:
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,我从接受的答案中理解,问题在于如何生成字节码。
我希望能够更好地理解如何识别生成的各个分支,然后我可以更好地判断是否测试它们(它们是否无法访问等)。
答案 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有时未能正确识别所涵盖的内容。