我正在嘗試對通過 id 洗掉物體的方法進行測驗。我已經為具有給定 id 的物體不存在的情況撰寫了測驗,但是如果物體存在,我顯然做錯了。這是從服務中洗掉的方法。我使用deleteById()的方法JpaRepository。
public void deleteById(Integer id) {
Optional<Agency> optionalAgency = repo.findAll().stream()
.filter(agency -> agency.getId().equals(id))
.findFirst();
if (optionalAgency.isPresent()) {
repo.deleteById(optionalAgency.get().getId());
} else {
throw new AgencyNotFoundException("Agency not found");
}
}
這是我的測驗:
@Mock
private AgencyRepository agencyRepository;
@Mock
private AgencyMapper mapper;
@InjectMocks
private AgencyService agencyService;
@Test
void delete() {
Agency agency = new Agency();
when(agencyRepository.findById(1)).thenReturn(Optional.of(agency));
agencyService.deleteById(1);
verify(agencyRepository).deleteById(1);
}
我應該做出什么斷言來驗證洗掉是否成功?我試過的方法不行,測驗的結果是拋出了例外。我猜測拋出例外是因為agencyRepository.findById((int) 1L);基本上不再存在,但我認為也許有更好的方法來驗證洗掉,而無需搜索已洗掉的物件。
uj5u.com熱心網友回復:
不是答案,但你的方法可以寫成這樣:
public void deleteById(Integer id) {
Agency agency = repo.findById(id).orElseThrow(() -> throw new AgencyNotFoundException("Agency not found"));
repo.deleteById(agency.getId());
}
因為:
Optional<Agency> optionalAgency = repo.findAll().stream().filter(agency -> agency.getId().equals(id)).findFirst();效率不高。如果您有數千個代理怎么辦?你會獲取所有并過濾所有這些只是為了通過 id 查找。您的存盤庫中已經有了該方法。if (optionalAgency.isPresent()) {}Optional.isPresent 不是好的做法。閱讀這里和這個答案
uj5u.com熱心網友回復:
repo是一個模擬,因此呼叫deleteById它實際上不會洗掉任何內容。相反,您可以驗證呼叫AgencyService'sdeleteById實際呼叫AgencyRepository's deleteById。
編輯:
存盤庫的代碼使用findAll, not findById,因此您需要確保模擬:
@Test
void delete() {
Agency agency = new Agency();
agenct.setId((int) 1L);
when(agencyRepository.findAll()).thenReturn(Collections.singletonList(agency));
agencyService.deleteById((int) 1L);
verify(agencyRepository).delteById((int) 1L);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/390145.html
