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
相关产品推荐
相关产品推荐

