为什么声纳(JaCoCo)要求我测试我的包裹?

问题描述 投票:0回答:1

我正在尝试关闭应用程序中的一些测试漏洞,发现 JaCoCo 声纳插件在枚举中提供了较小的覆盖范围,因为它认为我应该测试包名称。

这是为什么?

它向我展示了我的一个枚举中的 97% 覆盖率,并在包声明顶部显示一条红线,如下所示,告诉我对其进行测试...它在所有枚举中以及仅在枚举中执行此操作。

Sonar screenshot

sonarqube jacoco
1个回答
2
投票

我来这里寻找这个问题的答案,经过更多的挖掘,我发现这是由于一些静态方法所致,这些方法可以在编译后的枚举类的字节码中找到,Jacoco 希望涵盖这些静态方法。经过一些实验,我想出了以下超类,用于使用 JUnit 4 进行专注于枚举的单元测试。这解决了我的枚举覆盖问题。

import org.junit.Test;    
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import static org.junit.Assert.assertEquals;

public abstract class EnumTest {
    @Test
    public void verifyEnumStatics() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Class e = getEnumUnderTest();
        Method valuesMethod = e.getMethod("values");
        Object[] values = (Object[]) valuesMethod.invoke(null);
        Method valueOfMethod = e.getMethod("valueOf", String.class);
        assertEquals(values[0], valueOfMethod.invoke(null, ((Enum)values[0]).name()));
    }

    protected abstract Class getEnumUnderTest();
}

然后像这样使用它:

public class TravelTypeTest extends EnumTest {
    @Override
    protected Class getEnumUnderTest() {
        return TravelType.class;
    }

    // other test methods if needed
}

这是一个粗略的第一次尝试 - 它不适用于无论出于何种原因没有任何条目的枚举,并且毫无疑问有更好的方法来获得相同的效果,但这将通过确保您执行生成的静态方法可以检索枚举的值,并且如果将第一个枚举条目的名称传递给 valueOf() 方法,您将获得第一个枚举条目。

理想情况下,我们会编写一个测试来搜索被测包中的所有枚举,并自动以相同的方式执行它们(并且避免必须记住为继承自 EnumTest 的每个新枚举创建一个新的测试类),但我没有很多枚举,所以我还没有感受到任何尝试这个的压力。

© www.soinside.com 2019 - 2024. All rights reserved.