Java 中的代码覆盖率,其中 EclEmma 未扫描,期望出现异常方法

2022-09-02 13:00:59

我试图使用Eclipse和EclEmma在java中覆盖我的代码。

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

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

EclEmma说测试失败了,因为有一个非法的论据被抛出。因此,它删除了我的代码覆盖率指示器,即使它应该抛出一些东西。有没有一个选项可以让它看到JUnit预期的异常标记?

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


答案 1

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

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

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

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


答案 2

现在还不能评论,但我想指出,关于公认的答案,有一个很好的理由来关注测试代码的覆盖率。

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


推荐