首页 > 解决方案 > 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);
                });
    }

标签: spring-bootjunit

解决方案


你应该使用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));
}

试试这个,如果有异常,请告诉我......


推荐阅读