我正试图在我的应用程序中关闭一些测试漏洞,发现JaCoCo声纳插件在我的枚举中给了我一个较小的覆盖范围,因为它认为我应该测试包名称。
为什么?
它在我的一个枚举中显示97%的覆盖率,并在包装声明的顶部显示一条红线,告诉我测试它......它只在所有枚举和枚举上执行。
答案 0 :(得分: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继承的每个新枚举创建一个新的测试类),但我没有很多枚举,所以我还没有感受到尝试这个的压力。