Java 如何使用Mockito将void方法测试到服务类中?
我需要通过我的所有测试,并达到我的项目的所有类的完整代码覆盖率 我创建了一个存储库、服务和控制器类 我需要将所有单个方法测试到这些类中 我有以下课程: 1个带ApplicationController测试的ApplicationController 2带UserServiceTest的UserService 3带有UserRepositoryTest的UserRepository 这是控制器:Java 如何使用Mockito将void方法测试到服务类中?,java,spring,unit-testing,testing,mockito,Java,Spring,Unit Testing,Testing,Mockito,我需要通过我的所有测试,并达到我的项目的所有类的完整代码覆盖率 我创建了一个存储库、服务和控制器类 我需要将所有单个方法测试到这些类中 我有以下课程: 1个带ApplicationController测试的ApplicationController 2带UserServiceTest的UserService 3带有UserRepositoryTest的UserRepository 这是控制器: @Controller @RequestMapping("/") @SessionA
@Controller
@RequestMapping("/")
@SessionAttributes("user")
public class ApplicationWebController {
@Autowired
private UserService userService;
@Autowired
private FundService fundService;
@PostMapping("/save-user")
public String saveUser(User user, Model model) {
final User presentUsername =
userService.getUserByUsername(user.getUsername());
if (presentUsername == null) {
userService.insertNewUser(user);
if((user.getUsername()).equals("admin")) {
userService.updateRoleToAdmin(user.getId());
}
}
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = ApplicationWebController.class)
public class ApplicationWebControllerTest {
@Autowired
private WebClient webClient;
@MockBean
private UserService userService;
@Test
public void test_whenInsertedUserIsAdmin_DoUpdateOnRole() throws
Exception {
User userInserted = new User(1L, "admin", "password", 1);
mvc.perform(post("/save-user")
.param("id", "1")
.param("username", "admin")
.param("password", "password")
.param("role", "1"));
if (userInserted.getUsername() == "admin") {
verify(userService).updateRoleToAdmin(1L);
}
}
}
这里我插入一个新用户;如果User.username等于admin,那么我将使用userService.updateRoletLoadMinuser.getId更新字段角色
这是控制器的JUnit测试:
@Controller
@RequestMapping("/")
@SessionAttributes("user")
public class ApplicationWebController {
@Autowired
private UserService userService;
@Autowired
private FundService fundService;
@PostMapping("/save-user")
public String saveUser(User user, Model model) {
final User presentUsername =
userService.getUserByUsername(user.getUsername());
if (presentUsername == null) {
userService.insertNewUser(user);
if((user.getUsername()).equals("admin")) {
userService.updateRoleToAdmin(user.getId());
}
}
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = ApplicationWebController.class)
public class ApplicationWebControllerTest {
@Autowired
private WebClient webClient;
@MockBean
private UserService userService;
@Test
public void test_whenInsertedUserIsAdmin_DoUpdateOnRole() throws
Exception {
User userInserted = new User(1L, "admin", "password", 1);
mvc.perform(post("/save-user")
.param("id", "1")
.param("username", "admin")
.param("password", "password")
.param("role", "1"));
if (userInserted.getUsername() == "admin") {
verify(userService).updateRoleToAdmin(1L);
}
}
}
这项测试正确地通过了
现在我有了服务类和相关的测试类
这是服务班
@Service
public class UserService {
private UserRepo userRepo;
public void updateRoleToAdmin(Long id) {
userRepo.updateRoleToAdmin(id);
}
}
这个类也必须经过测试,这是服务的JUnit类
@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {
@Mock
private UserRepo userRepo;
@InjectMocks
private UserService userService;
@Test
public void test_updateRoleToAdmin() {
//I DON'T KNOW HOW WRITE HERE
//I NEED TO TEST THE RESPECTIVE METHOD IN SERVICE CLASS
//THE METHOD IN userRepo IS A VOID METHOD
}
}
这些是我的存储库类和JUnit测试
public interface UserRepo extends JpaRepository<User, Long> {
@Modifying(flushAutomatically = true, clearAutomatically = true)
@Transactional
@Query("update User u set u.role = 2 where u.id = :userid")
void updateRoleToAdmin(@Param("userid") Long id);
}
此外,该测试正确通过
现在,我必须在UserServiceTest JUnit测试类中编写一个测试
我不知道该怎么办,因为这是一个无效的方法,我不能使用whenmethod.thenReturn。。下面的断言
我的所有类的代码覆盖率必须达到100%,如果不测试UserService.updateRoletLoadMinLong id方法,我就无法访问它
请帮忙,因为我不知道如何在那里测试void方法
多谢各位。
我需要通过我的所有测试,并达到我的项目的所有类的完整代码覆盖率
我创建了一个存储库、服务和控制器类
我需要将所有单个方法测试到这些类中。您应该测试SUT方法内部发生的事情。您已经模拟了回购协议,因此只需验证测试中的行为:
@Test
public void shouldUpdateRoleToAdmin() {
// When
userService.updateRoleToAdmin(anyLong());
// Then
verify(userRepo, times(1)).updateRoleToAdmin(anyLong());
}
在您使用特定id调用该方法之后。我尝试过,但测试没有通过。失败:需要但未调用:userRepo.UpdateRoletLoadMin1l;->在com.crowdfunding.service.UserServiceTest.test_UpdateRoletLoadMinUserServiceTest.java:28上,实际上,与该模拟的交互为零。我尝试了两种方法:1验证UserRepo,times1.UpdateRoletLoadMinAnyLong;2用户=新用户1L,管理员,密码,1;verifyuserRepo,times1.UpdateRoletLoadMinUser.getId;您在验证之前调用过服务方法吗?现在我添加了userService.updateRoletLoadMinAnyLong;而且很有效!!!非常感谢你