记录项目中一次单元测试

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

提示:以下是本篇文章正文内容,下面案例可供参考

一、单元测试私有类方法

这里记录一下单元测试私有类方法时应该注意的点

二、使用步骤

1.测试方法

代码如下(示例):

//todo AssertUtil.assertTrue会抛出异常,这里也没写怎么处理异常
    private List<SdaFrequencyChangesForm> assembleFrequencyData(List<FrequencyChanges> formList, List<String> batteryIdList) {
        List<SdaFrequencyChangesForm> sendList = new ArrayList<>();
        Map<String, VinBatteryIdMappingVO> mapping = bcaMapper.queryVinBidMapping(batteryIdList);
        for (FrequencyChanges frequencyChanges : formList) {
            AssertUtil.assertTrue(Objects.nonNull(frequencyChanges.getFrequency())
                    && StringUtils.hasText(frequencyChanges.getBatteryId())
                    && Objects.nonNull(frequencyChanges.getDuration()), ApplicationEnum.SDA_HAS_EMPTY_DATA);
            SdaFrequencyChangesForm sdaFrequencyChangesForm = new SdaFrequencyChangesForm();
            sdaFrequencyChangesForm.setFrequency(frequencyChanges.getFrequency());
            sdaFrequencyChangesForm.setBId(frequencyChanges.getBatteryId());
            sdaFrequencyChangesForm.setPeriod(String.valueOf(frequencyChanges.getDuration()));
            sdaFrequencyChangesForm.setVin(mapping.get(sdaFrequencyChangesForm.getBId()).getVin());
            sendList.add(sdaFrequencyChangesForm);
        }
        return sendList;
    }

注意,本文使用的代码中已经使用了@Mock和@InjectMocks模拟了相关类

2.具体步骤

测试私有类方法时无法直接调用,需要用到java反射机制,同时这里调用了Mapper层的方法,需要用到PowerMockito的when机制
代码如下(示例):

@Test
    public void assembleFrequencyDataTest() throws Exception {
        List<FrequencyChanges> frequencyChangeslist = new ArrayList<FrequencyChanges>();
        FrequencyChanges frequencyChanges = new FrequencyChanges();
        frequencyChanges.setFrequency(10);
        frequencyChanges.setBatteryId("BBA76DB39A58E1CF4823220CF2D5F113");
        frequencyChanges.setDuration(BigDecimal.valueOf(2.5));
        frequencyChangeslist.add(frequencyChanges);
        List<String> batteryIdList = new ArrayList<>();;
        batteryIdList.add("BBA76DB39A58E1CF4823220CF2D5F113");
        Map<String, VinBatteryIdMappingVO> mapping = new HashMap<>();
        VinBatteryIdMappingVO vinBatteryIdMappingVO = new VinBatteryIdMappingVO();
        vinBatteryIdMappingVO.setVin("LR6DACDG0LX200375");
        vinBatteryIdMappingVO.setBatteryId("BBA76DB39A58E1CF4823220CF2D5F113");
        mapping.put("BBA76DB39A58E1CF4823220CF2D5F113",vinBatteryIdMappingVO);
        PowerMockito.when(bcaMapper.queryVinBidMapping(anyList()))
                .thenReturn(mapping);
        Method assembleFrequencyData = bcaServiceImpl.getClass()
                .getDeclaredMethod("assembleFrequencyData",List.class,List.class);
        assembleFrequencyData.setAccessible(true);
        Object formlist = assembleFrequencyData.invoke(bcaServiceImpl,frequencyChangeslist,batteryIdList);
        Assert.assertNotNull(formlist);
        System.out.println(String.valueOf(formlist));

    }

总结

首先是要创建私有类的方法,需要使用类对象,方法名字符串,方法参数的类

Method assembleFrequencyData = bcaServiceImpl.getClass()
                .getDeclaredMethod("assembleFrequencyData",List.class,List.class);
assembleFrequencyData.setAccessible(true);

然后是mock一下调用的其他方法

PowerMockito.when(bcaMapper.queryVinBidMapping(anyList()))
                .thenReturn(mapping);

然后就可以运行得到测试结果了,只不过结果限定是object类型

Object formlist = assembleFrequencyData.invoke(bcaServiceImpl,frequencyChangeslist,batteryIdList);

当然,单元测试要考虑路径覆盖率,像本文方法中使用assert会抛出异常,
但是作者又不去catch这个异常,所有暂时没做其他分支的测试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值