0
点赞
收藏
分享

微信扫一扫

单测篇 - 如何mock静态常量


本文对应源码地址:
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";
    }
}

直接公布答案,其实我们可以借助PowerMockMemberMatcher

(org.powermock.api.support.membermodification.MemberMatcher),

当然也可以使用其实现类MemberModifierPowerMockito 则写出的单测如下:

@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%.

单测篇 - 如何mock静态常量_静态方法

2 引申

做一点点引申,很多公司一般都有自己的分布式配置中心(或平台)。而这些配置落到我们自己的代码中,一般就是一个个的静态常量,这时候如果要对其进行写单测时,其实完全没必要去理解其具体的实现,只要将其当做一个个的静态常量就可以了。

单测篇 - 如何mock静态常量_Test_02



举报

相关推荐

0 条评论