Java JaCoCo分支机构覆盖率-尝试使用资源

Java JaCoCo分支机构覆盖率-尝试使用资源,java,junit,bytecode,jacoco,Java,Junit,Bytecode,Jacoco,我有一个方法,我正在尝试进行单元测试。我无法发布实际代码,但它看起来是这样的: public int getTotal() throws MyException { int total = 0; try (ExternalResource externalResource = ExternalService.getResource()) { try (OtherExternal otherResource = externalResource.getOtherRe

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

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显示该块完全被覆盖

我读过,并且从接受的答案中了解到问题在于字节码是如何生成的


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

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

根据0.8.2版:

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

我已经使用openjdk java8在本地测试了这一点,我的资源试用现在报告了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%的覆盖率

可能的重复我认为在你所引用的问题的答案中有相当详细的分析。如果这还不够,那么你能详细说明什么是不清楚的吗?我不明白“对是否测试它们做出更好的判断”应该导致什么。测试无法访问的代码是不可能的,所以不需要“判断”。在理解可测试场景时,不必深入字节码细节,无论是否有异常完成正文,是否有异常结束。如果测试这些组合不能覆盖所有路径,那么就无法覆盖其余路径。也许使用ECJ进行测试会有所帮助,另请参见JaCoCo,它准确地显示了在字节码级别执行的内容。所以,当映射回源代码以备资源试用时,我不会将这一事实命名为“失败”,因为这看起来不适合您。