我试图在我的应用程序中关闭一些测试孔,发现JaCoCo sonar插件在我的枚举中给我一个较小的覆盖范围,因为它认为我应该测试软件包名称。为什么声纳(JaCoCo)要求我测试我的软件包?
这是为什么?
它向我展示了其中一个枚举的97%的覆盖率,并在这样的包声明的顶部显示了一条红线,告诉我要测试它......它在所有枚举和枚举中都是如此。
我试图在我的应用程序中关闭一些测试孔,发现JaCoCo sonar插件在我的枚举中给我一个较小的覆盖范围,因为它认为我应该测试软件包名称。为什么声纳(JaCoCo)要求我测试我的软件包?
这是为什么?
它向我展示了其中一个枚举的97%的覆盖率,并在这样的包声明的顶部显示了一条红线,告诉我要测试它......它在所有枚举和枚举中都是如此。
我来到这里寻找这个问题的答案,并经过一些挖我发现,这是由于可在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继承的新枚举创建一个新的测试类) ,但我没有很多枚举,所以我还没有感受到任何压力。
努力+1 ...谢谢!你应该把这个推给JaCoCo的人,这样他们就可以开始工作了。 –
您可以为其中一个枚举添加coverage选项卡的屏幕截图吗? –
@ Fabrice-SonarTeam当然......那就是! –
好的,这看起来很奇怪......你使用的是哪个版本的Sonar?使用哪个构建工具?我建议你使用内置的JaCoCo覆盖工具,而不需要更多的配置。 –