小编use*_*818的帖子

运行JUnit测试时不执行静态类初始化

我有一个带有一些静态字段的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" };
Run Code Online (Sandbox Code Playgroud)

并且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);
Run Code Online (Sandbox Code Playgroud)

当单独执行测试时,测试按预期执行,但是当所有JUnit测试一起执行时(从带有Run As的Java项目 - > Junit测试),测试会给出空指针异常.

我做了一些调试,我发现问题(如标题中所述)是静态类未初始化 - 当调用静态方法时,REST_CACHE_DAO和HOLIDAYS_CACHE_DAO为空.不调用PDMapCacheDAOImpl的构造函数并且不注入模拟,因此当我们使用它们时,它会给出一个NPE.

我已经阅读了一些执行测试的工具,比如有这个错误的eclemma(一些静态类没有被初始化).在这种情况下,解决方案是包含-f选项.

这就是Eclemma网站关于这个问题所说的:"

2.8.EMMA如何定义班级覆盖范围?首先,一个类需要被认为是可执行的,甚至可以考虑覆盖.如果已由JVM加载并初始化,则认为可执行类已被覆盖.类初始化意味着执行类静态构造函数(如果有).请注意,即使没有执行其他方法,也可以覆盖类.在没有-f选项的情况下使用emmarun时,通常会看到少量已加载但未初始化的类.EMMA报告类覆盖率,以便您可以发现测试套件似乎没有"触及"的类:它们可能是死代码,也可能需要更多的测试注意力.

有趣的是,我们没有使用Eclemma,我们正在使用Cobertura,但行为和错误是相同的.

有没有人知道Cobertura中的这个错误以及如何解决它?(在Cobertura或通用方式)?

java junit static initialization cobertura

6
推荐指数
1
解决办法
2498
查看次数

标签 统计

cobertura ×1

initialization ×1

java ×1

junit ×1

static ×1