【问题标题】:EclEmma(Jacocco) shows line not covered even if the line is executedEclEmma(Jacoco) 显示未覆盖的行,即使该行已执行
【发布时间】:2019-01-04 15:01:49
【问题描述】:

我正在尝试提高我的代码的行覆盖率。在我调用一个方法的地方执行了一行,该方法又会引发异常。但线路覆盖显示红色,表示线路未执行。

代码:

1 public void myMethod(SomeService someService){
2   throwException(someService);
3 }

4 public void throwException(SomeService someService){
5   THROW an exception here
6 }

在我的测试类中,我正在准备 SomeService 所需的数据并从上面的代码中调用 myMethod。第 2 行显示红色,即使该行被执行并按预期抛出异常。请建议我如何显示覆盖的线路以增加线路覆盖率。

【问题讨论】:

    标签: java unit-testing junit mockito jacoco


    【解决方案1】:

    Please use search 在发布问题之前,因为这是widely known JaCoCo 限制,在EclEmma FAQJaCoCo FAQ 中都有描述:

    有异常的源代码行显示没有覆盖。为什么?

    JaCoCo 使用所谓的探针确定代码执行。探针被插入到控制流的某些位置。当执行了后续探测时,代码被视为已执行。如果出现异常,这样的指令序列会在中间某处中止,并且相应的源代码行不会被标记为已覆盖。

    换句话说:如果方法调用总是像您的示例中那样抛出异常,那么此方法调用的行将永远不会被标记为完全覆盖,也就是绿色。看到与所涵盖的方法调用一致的唯一方法是执行/测试,当此方法调用不引发异常时。

    【讨论】:

      【解决方案2】:

      我无法从你的例子中看出,但我之前搞砸了测试,因为我对例外情况不够具体。也许抛出了一个异常,但不是你期望的那个?对我来说,在单元测试中,很容易抛出 NullPointerException。也许它被抛出,导致您的测试通过,但代码覆盖率未显示为已覆盖?

      【讨论】:

      • 感谢您的回复。但是我在junit测试中有“expected = CustomRuntimeException.class”,测试用例通过了这意味着异常被抛出了我所期待的
      • 从我的代码中我也只能看到第 2 行没有被覆盖。其他所有内容都按预期覆盖。
      猜你喜欢
      • 2016-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      • 2015-04-20
      • 2020-05-12
      相关资源
      最近更新 更多