Sonarqube 为什么sonar(JaCoCo)要我测试我的软件包?

Sonarqube 为什么sonar(JaCoCo)要我测试我的软件包?,sonarqube,jacoco,Sonarqube,Jacoco,我试图填补我的应用程序中的一些测试漏洞,发现JacocoSonar插件在我的枚举中的覆盖范围更小,因为它认为我应该测试包名 为什么呢 它在我的一个枚举中显示了97%的覆盖率,并在包声明顶部显示了一条红线,像这样,告诉我测试它。。。它在所有枚举中以及仅在枚举上执行此操作 我来这里寻找答案,在进一步挖掘之后,我发现这是由于一些静态方法,这些方法可以在编译的enum类的字节码中找到,Jacoco希望涵盖这些方法。在一些实验之后,我提出了以下超类,用于单元测试,这些测试主要针对枚举,使用JUnit4。这

我试图填补我的应用程序中的一些测试漏洞,发现JacocoSonar插件在我的枚举中的覆盖范围更小,因为它认为我应该测试包名

为什么呢

它在我的一个枚举中显示了97%的覆盖率,并在包声明顶部显示了一条红线,像这样,告诉我测试它。。。它在所有枚举中以及仅在枚举上执行此操作


我来这里寻找答案,在进一步挖掘之后,我发现这是由于一些静态方法,这些方法可以在编译的enum类的字节码中找到,Jacoco希望涵盖这些方法。在一些实验之后,我提出了以下超类,用于单元测试,这些测试主要针对枚举,使用JUnit4。这解决了我的枚举覆盖率问题

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继承的每个新枚举创建一个新的测试类),但是我没有太多的枚举,所以我还没有感受到任何尝试的压力。

你能为其中一个枚举添加覆盖率选项卡的屏幕截图吗?@Fabrice Sonar团队当然。。。就在那里!好吧,这看起来很奇怪。。。你用的是哪种型号的声纳?使用哪个构建工具?我建议您使用内置的JaCoCo覆盖工具,无需更多配置。我使用的是最新的Sonar 3.4.1和maven 2.2.1。。。我将研究如何使用JoCoCo。。。回到这里。默认情况下,Sonar在运行“mvn Sonar:Sonar”时将使用JaCoCo,如果您没有强制Cobertura的话。+1表示努力。。。谢谢你应该把这个推给JaCoCo的人,这样他们就可以开始工作了。