提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
记录一次单元测试
提示:以下是本篇文章正文内容,下面案例可供参考
一、单元测试私有类方法
这里记录一下单元测试私有类方法时应该注意的点
二、使用步骤
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这个异常,所有暂时没做其他分支的测试