前言
文笔不行,如果有什么想吐槽的地方尽管说,各位大佬将就看。哈哈哈
在我们测试service 的逻辑时,需要mock 掉dao层的数据返回,我们可以通过 Mockito 的 行为定制功能,实现当 dao 层方法请求的时候,定制返回数据。
设计
实现
dao 层实现
@Mapper
public interface IActivityDao {
Activity queryActivityById(Long activityId);
/**
* 运营平台查询活动
* @param pageReq 分页查询条件
* @return: java.util.List<cn.anoxia.lottery.infrastructure.po.Activity>
*/
List<Activity> queryActivityByPage(ActivityPageReq pageReq);
}
service 实现
/**
* @description:
* @author:huangle
* @date: 2022/4/22
*/
@Service
public class LotteryActivityDeploy implements ILotteryActivityDeploy {
@Resource
private IActivityDao activityDao;
@Override
public ActivityRes queryActivityListDeploy(ActivityReq req) {
// 构建请求参数
ActivityPageReq pageReq = new ActivityPageReq();
BeanUtils.copyProperties(req,pageReq);
// 查询
List<Activity> activityList = activityDao.queryActivityByPage(pageReq);
if (CollectionUtils.isEmpty(activityList)) {
return new ActivityRes(Result.buildSuccessResult());
}
List<ActivityDTO> activityDTOList = new ArrayList<>();
activityList.forEach(activity->{
ActivityDTO activityDto = new ActivityDTO();
BeanUtils.copyProperties(activity,activityDto);
activityDTOList.add(activityDto);
});
return new ActivityRes(Result.buildSuccessResult(),activityList.size(),activityDTOList);
}
}
测试
在测试的过程中,发现了很多的问题。比如传参问题,在我们使用定制方法返回的时候,传参 如下代码所示:
每个地方都是 new 了一个新的对象。后面执行的时候,获得的activityList一直是 空的,我就很纳闷了。
后面发现mock在调用的时候,存在参数匹配。在调用的时候,有精准匹配,模糊匹配,和任意匹配。
就是说 我们在定制的时候,要考虑我们传的参数。
doReturn(this.staticList()).when(activityDao).queryActivityByPage(new ActivityPageReq(1, 10));
List<Activity> activityList = activityDao.queryActivityByPage(new ActivityPageReq(1, 10));
private List<Activity> staticList(){
Activity activity = new Activity();
activity.setActivityId(10001L);
activity.setActivityName("测试活动");
Activity activity2 = new Activity();
activity2.setActivityId(100012L);
activity2.setActivityName("测绘胡东");
Activity activity3 = new Activity();
activity3.setActivityId(100013L);
activity3.setActivityName("额hihi爱仕达");
return Arrays.asList(activity,activity2,activity3);
}
精准匹配
// 请求参数
private ActivityPageReq pageReq = new ActivityPageReq(1, 10);
// 定制返回
doReturn(this.staticList()).when(activityDao).queryActivityByPage(pageReq);
// 执行
List<Activity> activityList = activityDao.queryActivityByPage(pageReq);
结果,如果是按上面第一种方式,每个都去new一个请求参数,后面的调用就会一直是空的
模糊匹配 & 任意匹配
Activity activity = new Activity();
activity.setActivityId(10001L);
activity.setActivityName("测试活动");
doReturn(activity).when(activityDao).queryActivityById(Mockito.anyLong());
Activity activity1 = activityDao.queryActivityById(1L);
Activity activity2 = activityDao.queryActivityById(11L);
Activity activity3 = activityDao.queryActivityById(2L);
总结
在同mock定制行为的时候,我们可以根据不同的参数匹配方式,来获得我们想要的数据,这样可以检查一些特定的参数是否请求正确,然后同时又可以检查任意参数的情况。
终究还是太菜了,没有理解本质,在做的时候还吐槽别人这种机制都没有,哈哈哈哈,没想到小丑竟是我自己。