Java中的代码覆盖与EclEmma不扫描期望异常方法

时间:2012-10-06 07:01:43

标签: java eclipse unit-testing junit eclemma

我正在尝试使用Eclipse和EclEmma在java中获取代码覆盖率。

我的测试是使用JUnit 4,我有一些看起来像这样的测试:

    @Test(expected = IllegalArgumentException.class)
    public void createTime_withInvalidMinuteUnder0_throws(){
    //Arrange
    ...
    //Act
    Something triggering IllegalArgumentException Here       
}

EclEmma说测试失败了,因为抛出了IllegalArgumentException。因此它会丢弃我的代码覆盖率指标,即使它应该抛出一些东西。是否有一个选项可以让它看到JUnit预期的异常标记?

编辑:我发现如果你把测试添加到测试声明中,它也可以工作!

3 个答案:

答案 0 :(得分:21)

不,没有办法让EclEmma注意到expected条款。他们承认这一事实here

  

为什么JUnit4测试用例的预期异常显示为未涵盖?

     

具有预期异常的JUnit4测试用例即使已执行也显示为未涵盖。这样做的原因是底层的JaCoCo代码覆盖库只考虑在执行某些探测时执行的代码。对于标有@Test{expected=...}的成功测试用例,情况并非如此。

就个人而言,我不会太担心它。测试用例的覆盖范围是EclEmma可以告诉你的最不值得的事情;我总是完全忽略这些指标,并专注于我的生产代码的覆盖范围。

答案 1 :(得分:4)

暂不公开评论,但我想指出,就接受的答案而言,有一个很好的理由要注意测试代码的覆盖范围。

使用JUnit可以轻松搞砸测试方法命名约定或忘记@Test注释,具体取决于您的JUnit版本。这样做,你很容易被愚弄,认为你坚实的绿色条意味着你刚刚添加的好测试通过,而实际上它从未运行过。覆盖着色将显示这一点非常突出。当然,除了这个线程指出的,一些抛出异常的测试可能看起来像是在他们没有运行时。

答案 2 :(得分:0)

我遇到了同样的问题,并提出了拉动请求,处理这种烦恼的最主要原因。我只处理方法调用的操作码,而不是添加太多探测器。换句话说,解决了由方法调用引发的异常引起的(先前)错误覆盖结果的问题,但是如果异常是由例如零除,错误的强制转换或数组索引引发的,则不会问题

https://github.com/jacoco/jacoco/pull/261

随意评论拉取请求或参与我在JaCoCo邮件列表上开始的讨论。