单测篇 - 如何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%.
在这里插入图片描述

2 引申

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nrsc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值