gpt4 book ai didi

java - 如何使用 Mockito 将 void 方法测试到服务类中?

转载 作者:行者123 更新时间:2023-11-28 21:16:23 25 4
gpt4 key购买 nike

我需要通过我的所有测试,并为我的项目的所有类实现完整的代码覆盖。

我创建了一个 Repository、Service 和 Controller 类。

我需要在这些类中测试所有单一方法。

我有这些类(class):1)ApplicationController与ApplicationControllerTest2) 用户服务与用户服务测试3) UserRepository 和 UserRepositoryTest

这是 Controller :

 @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());
}
}

在这里我插入一个新用户;如果 User.username 等于“admin”,那么我用 userService.updateRoleToAdmin(user.getId()) 更新字段“role”

这是 Controller 的 JUnit 测试:

@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);

}

Repo 类的测试:

@Test
public void test_UpdateRoleToAdmin() {
User user = new User(null, "admin", "password", 1);
User saved = userRepo.save(user);
userRepo.updateRoleToAdmin(saved.getId());
User found = userRepo.findByUsername("admin");
assertThat(found.getRole()).isEqualTo(2);
}

此外,此测试正确通过

现在我必须将测试写入 UserServiceTest JUnit 测试类。

我不知道我该怎么办,因为它是一个无效的方法,我不能使用 when(method).thenReturn(..) 和下面的断言

我的所有类(class)的代码覆盖率必须达到 100%,如果不测试“UserService.updateRoleToAdmin(Long id)”方法,我将无法达到它。

请帮忙,因为我不知道如何在那里测试 void 方法。

谢谢。我需要通过我的所有测试,并为我的项目的所有类实现完整的代码覆盖。

我创建了一个 Repository、Service 和 Controller 类。

我需要在这些类中测试所有单一方法。

最佳答案

您应该测试 SUT 方法内部发生的情况。您已经模拟了 repo 协议(protocol),因此只需验证测试中的行为:

@Test
public void shouldUpdateRoleToAdmin() {
// When
userService.updateRoleToAdmin(anyLong());

// Then
verify(userRepo, times(1)).updateRoleToAdmin(anyLong());
}

在您使用特定的 id 调用方法之后。

关于java - 如何使用 Mockito 将 void 方法测试到服务类中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57509813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com