ReflectionTestUtils在单元测试中的妙用

背景

在日常的代码中,单元测试是不可或缺的一环,然后很多时候我们的业务类不管是注入的字段还是写的方法都是使用private修饰符修饰的,这导致我们没有办法方便的进行单元测试,本文就简答介绍下如何通过spring自带的ReflectionTestUtils工具类来测试私有字段和测试私有方法实现

技术实现

ReflectionTestUtils是spring框架的一个非常有用的测试工具类,他的setField方法可以方便的设置类的私有成员对象,invokeMethod方法则可以方便的测试类的私有方法,下面我们结合mockito单元测试框架+ReflectionTestUtils来看一下简单实现的例子,首先这个是要被测试的用户业务类:

@Component("userBisiness")
public class UserBisiness{
    @Autowired
    private ConfigService configService;

    private boolean isOffline(Integer salesNo) {
        if(salesNo %2 ==0){
        return true;
        }
        return false;
    }

    private String getVersion() {
        List<String> configs = configService.getConfig(UserType.inner);
        if (ListUtil.isEmpty(configs)) {
            return null;
        }
       	return configs.get(0);
    }
}    

业务类依赖的外部服务类ConfigService类如下:

public interface ConfigService {
    List<String> getConfig(String type);

我们目的是为了测试UserBisiness的两个私有方法,由于其中一个私有方法还依赖另一个外部服务ConfigService,所以我们还要模拟这个外部接口类的返回来进行测试:

    @Test
    public void testCallPrivateMethod() {
        MockitoAnnotations.initMocks(this);

        String result = ReflectionTestUtils.invokeMethod(userBisiness, "getVersion");
        System.out.println(result);

        boolean result1 =
                ReflectionTestUtils.invokeMethod(userBisiness, "isOffline", 100);
        System.out.println(result1);
    }

    @Test
    public void testSetPrivateField() {
        MockitoAnnotations.initMocks(this);

        String result = ReflectionTestUtils.invokeMethod(userBisiness, "getVersion");
        System.out.println(result);

       ConfigService mockConfigService = Mockito.mock(ConfigService.class);
        Mockito.doReturn(Lists.newArrayList()).when(mockConfigService).getConfig(Mockito.any());

        ReflectionTestUtils.setField(userBisiness, "configService", mockConfigService);
        String result_mock = ReflectionTestUtils.invokeMethod(userBisiness, "getVersion");
        System.out.println(result_mock);

    }

这样我们就可以测试私有的方法和字段了

小结

ReflectionTestUtils工具类非常有用,可以设置私有成员变量的值,可以调用类的私有成员方法,这在单元测试中用处极大

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值