ArgumentCaptor usage in Unit Tests(ArgumentCaptor在单元测试中的使用)
本文介绍了ArgumentCaptor在单元测试中的使用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试为以下服务方法创建单元测试:
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);
}
我创建了以下单元测试:
@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());
}
据我所知,我们使用ArgumentCaptor
来捕获我们传递给方法的值。在本例中,我需要在正确的时间捕捉值,并比较发送到更新方法的名称的更新值和更新后的名称属性的返回值。然而,我找不到如何正确地测试它,并在我的测试方法中添加必要的注释。那么,我应该如何使用ArgumentCaptor
来验证我的UPDATE方法使用给定值(&QOOT;UPDATED Company NAME&QOOT;)更新公司。
推荐答案
以下是您的ArgumentCaptor
方案。
测试中的代码:
public void createProduct(String id) {
Product product = new Product(id);
repository.save(product);
}
请注意,a)我们在测试的代码中创建了一个对象,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在单元测试中的使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:ArgumentCaptor在单元测试中的使用
基础教程推荐
猜你喜欢
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01