[英]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.