本文对应源码地址:
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 {@Testpublic 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");}@Testpublic 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 引申
做一点点引申,很多公司一般都有自己的分布式配置中心(或平台)。而这些配置落到我们自己的代码中,一般就是一个个的静态常量,这时候如果要对其进行写单测时,其实完全没必要去理解其具体的实现,只要将其当做一个个的静态常量就可以了。