Springboot 单元测元使用powerMock替换静态方法System.getEnv
问题描述
静态工具类里用到了system.getenv。但是测试过程中无法设置系统变量,可以用mock替换掉System的getenv方法。
PowerMock
自带的Mockito无法对静态方法实现注入,需要安装powerMock依赖。
需要两个依赖,直接导入最新版否则会有bug。
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>2.0.9</version>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<version>2.0.9</version>
</dependency>
使用方法
1.给单元测试加上两个注解
@RunWith(PowerMockRunner.class) //指定PowerMockRunner运行器
@PrepareForTest({RedisKeyUtil.class}) //被测试的类
public class RedisKeyUtilTest {
....
}
2.进行测试
//mock设置 在测试类想要的位置注入System并替换getenv方法
....
@Before
public void setUp() {
PowerMockito.mockStatic(System.class);
PowerMockito.when(System.getenv("instanceId")).thenReturn("123");
//如果上述导入的版本是2.0.2 上一行代码会报错,得使用下面这行代码
//PowerMockito.when(System.getenv("instanceId")).thenAnswer((Answer<String>) invocation -> "123");
}
//原方法
....
public static final String instanceId = System.getenv("instanceId");
....
public static String demo(){
return "test:" + instanceId;
}
//测试方法
@Test
public void demo(){
Assert.assertEquals(RedisKeyUtil.demo(),"test:123");
}
4.测试结果
Process finished with exit code 0