You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dropwizard框架中如何对调用其他类静态方法的代码做单元测试

静态方法依赖场景的单元测试Mock实现方案

问题背景

为调用了其他类静态方法的业务函数编写单元测试时触发空指针异常,相关代码如下:

public class ClassA{
    private static LoadingCache<String, String> someMap;

    public static void init() {
        if (someMap == null) {
            someMap = CacheBuilder.newBuilder()
                .concurrencyLevel(10)
                .maximumSize(10) // 最大缓存10条记录
                .build(new CacheLoader<String, String>() { 
                    @Override
                    public String load(String key) {
                       return "myName";
                    }
                });
        }
    }
    public static String getName() {
        try {
            return someMap.get("key");
        } catch (ExecutionException ex) {
            LOGGER.error("Error {}", ex.getMessage());
        }
        return null;
    }
}

待测试的目标类及方法代码如下:

public class ClassB{
    public String method(){
        final String name = ClassA.getName();
        return "Hello: " + name;
    }
}

正式运行逻辑:Dropwizard框架服务启动阶段会调用ClassA.init()完成缓存初始化,因此生产环境直接调用ClassA.getName()不会出现问题。
单元测试问题:测试环境不会触发服务启动的初始化逻辑,someMap为null,调用ClassA.getName()时触发NPE。需求是Mock静态方法的返回值,实现类似when(ClassA.getName()).thenReturn("myName");的效果。

解决方案

1. 引入PowerMock测试依赖

在pom.xml中添加以下测试范围依赖:

<dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4</artifactId>
        <version>2.0.9</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-mockito2</artifactId>
        <version>2.0.9</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-core</artifactId>
        <version>2.0.9</version>
        <scope>test</scope>
</dependency>

2. 编写测试用例

最终可正常运行的测试代码如下:

@Test
public void test(){
    mockStatic(ClassA.class);
    when(ClassA.getName()).thenReturn("myName");
    // 后续测试逻辑
}

注意:测试类需要添加@RunWith(PowerMockRunner.class)和@PrepareForTest(ClassA.class)注解才能正常启用PowerMock的静态方法Mock能力。

内容的提问来源于stack exchange,提问作者harry123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 11:30:06