本文对应源码地址:
https://github.com/nieandsun/NRSC-STUDY/tree/master/nrsc-unit-test-study
1 如何mock静态常量
先看如下代码,这里如何对方法中的静态常量DEMO_CONSTANT
进行mock呢?
public class Demo1StaticConstant {
/***
* 这里的类型不能是基本类型或String哟 ~~ why(???)
*/
private static final Object DEMO_CONSTANT = "xiaomi";
/***
* 静态方法
* @param param
* @return
*/
public static String demoMethod(Object param) {
if (Objects.equals(param, DEMO_CONSTANT)) {
return "111";
}
return "222";
}
/***
* 非静态方法
* @param param
* @return
*/
public String demoMethod2(Object param) {
if (Objects.equals(param, DEMO_CONSTANT)) {
return "111";
}
return "222";
}
}
直接公布答案,其实我们可以借助PowerMock
的MemberMatcher
(org.powermock.api.support.membermodification.MemberMatcher),
当然也可以使用其实现类MemberModifier
或PowerMockito
则写出的单测如下:
@RunWith(PowerMockRunner.class)
@PrepareForTest({Demo1StaticConstant.class})
public class Demo1StaticConstantTest {
@Test
public void testDemoMethod() throws Exception {
//属性1:要mock的静态常量所在类的类型
//属性2:要mock的静态常量名称
//属性3:要mock的静态常量所在类的类型(或要mock的静态常量所在的对象)
//属性4:要设置的值
MemberModifier.field(Demo1StaticConstant.class, "DEMO_CONSTANT").set(Demo1StaticConstant.class, "huawei");
String result1 = Demo1StaticConstant.demoMethod("huawei");
Assert.assertEquals(result1, "111");
String result2 = Demo1StaticConstant.demoMethod("xiaomi");
Assert.assertEquals(result2, "222");
}
@Test
public void testDemoMethod2() throws Exception {
//属性1:要mock的静态常量所在类的类型
//属性2:要mock的静态常量名称
//属性3:要mock的静态常量所在类的类型(或要mock的静态常量所在的对象)
//属性4:要设置的值
Demo1StaticConstant demo = new Demo1StaticConstant();
MemberModifier.field(Demo1StaticConstant.class, "DEMO_CONSTANT").set(demo, "huawei");
String result1 = demo.demoMethod2("huawei");
Assert.assertEquals(result1, "111");
String result2 = demo.demoMethod2("xiaomi");
Assert.assertEquals(result2, "222");
}
}
贴一下运行结果,可以看到行覆盖率和分支覆盖率都是100%.
2 引申
做一点点引申,很多公司一般都有自己的分布式配置中心(或平台)。而这些配置落到我们自己的代码中,一般就是一个个的静态常量,这时候如果要对其进行写单测时,其实完全没必要去理解其具体的实现,只要将其当做一个个的静态常量就可以了。