使用 Mockito mock dao 层数据(参数匹配)

2,123 阅读2分钟

前言

文笔不行,如果有什么想吐槽的地方尽管说,各位大佬将就看。哈哈哈

在我们测试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定制行为的时候,我们可以根据不同的参数匹配方式,来获得我们想要的数据,这样可以检查一些特定的参数是否请求正确,然后同时又可以检查任意参数的情况。

终究还是太菜了,没有理解本质,在做的时候还吐槽别人这种机制都没有,哈哈哈哈,没想到小丑竟是我自己。