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

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

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

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

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

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

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

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

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

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

无法发表评论,但我想指出,就接受的答案而言,有一个很好的理由来关注测试代码的覆盖范围。

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

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

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

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