如何在模擬存盤庫上捕獲操作的值,以覆寫回傳值。
以這個測驗為例
@Mock
AccountRepository accountRepository;
@InjectMocks
AccountService accountService;
@Test
public void remove_staff_updates_roles() {
Account account = new Account("username", "pass");
when(accountRepository.findByUsername(any(String.class))).thenReturn(Optional.of(account));
accountService.updateStaffStatusByUsername("user", false);
// How can I capture the account that is to be saved here?
assertFalse(????.getValue().getRoles().contains(Role.ROLE_STAFF));
}
然后在服務中
public Account updateStaffStatusByUsername(String username, Boolean toState) {
Account account;
if (toState) {
return addRole(username, Role.ROLE_STAFF);
}
return removeRole(username, Role.ROLE_STAFF);
}
Account addRole(String username, Role role) {
Optional<Account> optionalAccount = accountRepository.findByUsername(username);
if (account.isEmpty()) {
throw new CustomException("No account exists with the username: " username, HttpStatus.NOT_FOUND);
}
Account account = optionalAccount.get();
account.addRole(role);
// I want to intercept this and take the value to evaluate
return accountRepository.save(account);
}
我想在服務保存更新的帳戶時驗證帳戶的狀態是否已正確更改。
uj5u.com熱心網友回復:
在這里,您正在傳遞Account(可選)類物件account以回應模擬服務,并且正在更新相同的物件并將其保存在資料庫中,因此您需要驗證該物件中的值。
assertFalse(account.getRoles().contains(Role.ROLE_STAFF)); //or vice-verse
uj5u.com熱心網友回復:
在我看來ArgumentCaptor正是您所需要的。請嘗試以下操作:
@Mock
AccountRepository accountRepository;
@InjectMocks
AccountService accountService;
@Test
public void remove_staff_updates_roles() {
Account account = new Account("username", "pass");
when(accountRepository.findByUsername(any(String.class))).thenReturn(Optional.of(account));
accountService.updateStaffStatusByUsername("user", false);
ArgumentCaptor<Account> accountCaptor = ArgumentCaptor.forClass(Account.class);
verify(accountRepository).save(accountCaptor.capture());
assertFalse(accountCaptor.getValue().getRoles().contains(Role.ROLE_STAFF));
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/317360.html
