gpt4 book ai didi

sonarqube - 为什么 sonar(JaCoCo) 要求我测试我的包裹?

转载 作者:行者123 更新时间:2023-12-02 02:07:23 37 4
gpt4 key购买 nike

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

这是为什么?

它在我的一个枚举中显示了 97% 的覆盖率,并在包声明顶部显示一条红线,告诉我要测试它……它在所有枚举中和仅在枚举中这样做。

Sonar screenshot

最佳答案

我来这里是为了寻找这个问题的答案,经过更多的挖掘,我发现这是由于一些静态方法可以在 Jacoco 期望涵盖的已编译枚举类的字节码中找到。经过一些实验后,我想出了以下父类(super class),用于使用 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 的新枚举创建一个新的测试类),但我没有很多枚举,所以我还没有感到尝试这个的任何压力。

关于sonarqube - 为什么 sonar(JaCoCo) 要求我测试我的包裹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14324106/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com