簡體   English   中英

如何使用Mockito在Service類中測試void方法?

[英]How test a void method into Service class, with Mockito?

我需要通過所有測試,並獲得項目所有類的完整代碼覆蓋率。

我創建了一個Repository,Service和Controller類。

我需要將所有單個方法測試到這些類中。

我有這些類:1)帶ApplicationControllerTest的ApplicationController 2)帶UserServiceTest的UserService 3)帶UserRepositoryTest的UserRepository

這是控制器:

 @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”

這是針對控制器的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類和相對測試類

這是服務類

@Service
public class UserService {

private UserRepo userRepo;

public void updateRoleToAdmin(Long id) {
    userRepo.updateRoleToAdmin(id);
}
}

該類也必須經過測試,這是Service的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);

}

回購類的測試:

@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(..)和以下斷言

我必須為所有類提供100%的代碼覆蓋率,並且未經測試“ UserService.updateRoleToAdmin(Long id)”方法就無法達到。

請幫忙,因為我不知道如何在此處測試void方法。

謝謝。 我需要通過所有測試,並獲得項目所有類的完整代碼覆蓋率。

我創建了一個Repository,Service和Controller類。

我需要將所有單個方法測試到這些類中。

您應該測試SUT方法內部發生的情況。 您已經模擬了存儲庫,因此只需在測試中驗證行為即可:

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

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

在調用具有特定id的方法之后。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM