我有一个带有一些静态字段的 java 类:
private static final PDMapCacheDAO REST_CACHE_DAO =
new PDMapCacheDAOImpl( Constants.REST_CACHE_NAME );
private static final PDMapCacheDAO HOLIDAYS_CACHE_DAO =
new PDMapCacheDAOImpl( Constants.HOLIDAYS_CACHE_NAME );
private static final String[] DATE_ARRAY = { "D", "0", "1", "2", "3", "C" };
JUnit 测试模拟了 REST_CACHE_DAO 和 HOLIDAYS_CACHE_DAO 的初始化行为:
final PDMapCacheDAOImpl holidaysMapCacheDAOImpl = mock(PDMapCacheDAOImpl.class);
final PDMapCacheDAOImpl restMapCacheDAOImpl = mock(PDMapCacheDAOImpl.class);
whenNew(PDMapCacheDAOImpl.class).withArguments(Constants.HOLIDAYS_CACHE_NAME).thenReturn(holidaysMapCacheDAOImpl);
whenNew(PDMapCacheDAOImpl.class).withArguments(Constants.REST_CACHE_NAME).thenReturn(restMapCacheDAOImpl);
当测试单独执行时,测试按预期执行,但是当所有 JUnit 测试一起执行时(来自 Java 项目,带有 Run As --> Junit Test),测试会给出空指针异常。
我做了一些调试,发现问题(如标题中所述)是静态类未初始化 - 当调用静态方法时 REST_CACHE_DAO 和 HOLIDAYS_CACHE_DAO 为空。PDMapCacheDAOImpl 的构造函数没有被调用,也没有注入模拟,因此当我们使用它们时,它会给出一个 NPE。
我已经阅读了一些执行测试的工具,例如具有此错误的eclemma(某些静态类未初始化)。在这种情况下,解决方案是包含 -f 选项。
这就是 Eclemma 网站关于这个问题的说法:”
2.8. EMMA 如何定义类覆盖率?首先,一个类需要被认为是可执行的,甚至被认为是覆盖范围。如果一个可执行类已被 JVM 加载和初始化,则认为它已被覆盖。类初始化意味着执行类静态构造函数(如果有)。请注意,即使没有执行任何其他方法,也可以覆盖一个类。当您使用不带 -f 选项的 emmarun 时,通常会看到少量已加载但未初始化的类。EMMA 报告类覆盖率,以便您可以发现测试套件似乎没有“触及”的类:它们可能是死代码或需要更多测试关注。
有趣的是我们没有使用 Eclemma,我们使用的是 Cobertura,但行为和错误是相同的。
有谁知道 Cobertura 中的这个错误以及如何解决它?(无论是在 Cobertura 还是以一般的方式)?