spring-boot - Junit - 测试使用 Foreach 的方法
问题描述
如何为下面的方法编写一个单元?
基本上planDetailRepository.findOnGoingModules方法返回一个UserStatus实体列表,然后在该列表上应用 forEach 方法,将状态设置为 1,然后将当前UserStatus实体保存到数据库中。
我对此进行测试的想法是验证UserStatusRepository保存方法被调用的次数。
planDetailRepository.findOnGoingModules:
@Query("SELECT a FROM UserStatus a join a.planDetail b where b.startDate = CURRENT_DATE AND a.userPlan.id = (SELECT c.id from UserPlan c WHERE c.plan.id = :plan_id and c.user.id = :user_id)")
List<UserStatus> findOngoingModules(@Param("plan_id") Integer plan_id, @Param("user_id") Integer user_id);
待测方法:
public void updateModuleStatusPerPlan(planId, userId){
planDetailRepository.findOngoingModules(planId, userId)
.forEach(userstatus -> {
userstatus.setStatus(1);
userStatusRepository.save(userstatus);
});
}
解决方案
你应该使用Mockito来做。你可以模拟 planDetailRepository 和 userStatusRepository 然后执行单元测试:
@Test
public void testUpdateModuleStatusPerPlan() {
List<UserStatus> userStatusList=new ArrayList<UserStatus>();
//Create new User Status objects and add them to list
when(planDetailRepositoryMock.findOngoingModules(planId, userId)).thenReturn(userStatusList);
when(userStatusRepositoryMock.save(Matchers.any(UserStatus.class)).thenReturn(null);
<<your class object>>.updateModuleStatusPerPlan(planId, userId);//Set any plan id or user id which should be the same as used while mocking planDetailRepositoryMock.findOngoingModules
verify(userStatusRepositoryMock,times(userStatusList.size()).save(Matchers.any(UserStatus.class));
}
试试这个,如果有异常,请告诉我......
推荐阅读
- powerbi - Power BI - 将值提取/移动到单独的列
- javascript - 试图让 2 个 Plotly 图独立工作——而不是使用全局变量
- flutter - 如何在颤动中将 onPressed 添加到多个 FloatingActionButton
- python - 如何将 Pandas 行压缩为一个,对列应用不同的条件
- tsql - 变量 = MAX() 导致语法不正确
- r - 可以以 PDF/X-3 格式 bookdown 输出吗?
- amcharts - 如何使用 Amchart 4 绘制带有空数据的条形图?
- flutter - Flutter 为 MatrixGestureDetector 开始更新设置初始状态
- pine-script - 松本攻略 套利点研究剧情
- c++ - 无法将结构插入集合:“不匹配运算符<”