本文介紹了ArgumentCaptor在單元測試中的使用的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我正在嘗試為以下服務方法創(chuàng)建單元測試:
public CompanyDTO update(CompanyRequest companyRequest, UUID uuid) {
final Company company = companyRepository.findByUuid(uuid)
.orElseThrow(() -> new EntityNotFoundException("Not found"));
company.setName(companyRequest.getName());
final Company saved = companyRepository.save(company);
return new CompanyDTO(saved);
}
我創(chuàng)建了以下單元測試:
@InjectMocks
private CompanyServiceImpl companyService;
@Mock
private CompanyRepository companyRepository;
@Captor
ArgumentCaptor<Company> captor;
@Test
public void testUpdate() {
final Company company = new Company();
company.setName("Company Name");
final UUID uuid = UUID.randomUUID();
final CompanyRequest request = new CompanyRequest();
request.setName("Updated Company Name");
when(companyRepository.findByUuid(uuid))
.thenReturn(Optional.ofNullable(company));
when(companyRepository.save(company)).thenReturn(company);
CompanyDTO result = companyService.update(request, uuid);
/* here we get the "company" parameter value that we send to save method
in the service. However, the name value of this paremeter is already
changed before passing to save method. So, how can I check if the old
and updated name value? */
Mockito.verify(companyRepository).save(captor.capture());
Company savedCompany = captor.getValue();
assertEquals(request.getName(), savedCompany.getName());
}
據(jù)我所知,我們使用ArgumentCaptor
來捕獲我們傳遞給方法的值。在本例中,我需要在正確的時間捕捉值,并比較發(fā)送到更新方法的名稱的更新值和更新后的名稱屬性的返回值。然而,我找不到如何正確地測試它,并在我的測試方法中添加必要的注釋。那么,我應該如何使用ArgumentCaptor
來驗證我的UPDATE方法使用給定值(&QOOT;UPDATED Company NAME&QOOT;)更新公司。
推薦答案
以下是您的ArgumentCaptor
方案。
測試中的代碼:
public void createProduct(String id) {
Product product = new Product(id);
repository.save(product);
}
請注意,a)我們在測試的代碼中創(chuàng)建了一個對象,b)我們想要驗證該對象的特定內容,c)我們在調用之后無法訪問該對象。這些情況幾乎就是你需要捕獲者的地方。
您可以這樣測試它:
void testCreate() {
final String id = "id";
ArgumentCaptor<Product> captor = ArgumentCaptor.for(Product.class);
sut.createProduct(id);
// verify a product was saved and capture it
verify(repository).save(captor.capture());
final Product created = captor.getValue();
// verify that the saved product which was captured was created correctly
assertThat(created.getId(), is(id));
}
這篇關于ArgumentCaptor在單元測試中的使用的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,