无法在 Java 单元测试中捕获值
Cannot catch value in Java Unit Test
我有以下服务方式:
public CommandDTO update(UUID uuid, EmployeeRequest request) {
final List<Product> productList = productRepository
.findAllByUuidOrderByOrderNumber(uuid);
final List<UUID> uuidList = request.getUuidList();
for (int i = 0; i < uuidList.size(); i++) {
Product product = productList.get(i);
product.setOrderNumber(i + 1);
// how can I get the product value in this line?
}
return CommandDTO.builder().uuid(uuid).build();
}
通常,我使用 ArgumentCaptor
来获取传递给存储库或服务的值。但是,在此示例中,我想要在 product.setOrderNumber(i + 1);
之后获得的产品值未传递服务或存储库。由于这个原因,我无法得到它。我不确定是否可以使用 @Spy
或 doAnswer
,但据我所知,这些方法不能使用,因为值没有传递给服务或回购。有什么想法吗?
product
变量来自productList
,后者又来自repository.findAllByUuidOrderByOrderNumber()
方法。所以如果你模拟你的存储库,你可以这样写:
Product givenProduct = new Product();
UUID givenUUID = UUID.randomUUID();
// Create an EmployeeRequest with a `uuidList`
EmployeeRequest givenRequest = new EmployeeRequest(/* TODO */);
// Use Mockito to return a `productList` you choose
// This uses a static import of `Mockito.when()`
when(productRepository.findAllByUuidOrderByOrderNumber(givenUUID)).thenReturn(List.of(givenProduct));
service.updateRequest(givenUUID, givenRequest);
理论上你甚至可以在上面的测试逻辑中 return 模拟产品,但我建议使用真实的 Product
对象。
现在无论该产品发生什么,都可以在您的测试中断言。
例如:
// `givenProduct` is element 0, and thus will get an orderNumber of 1
assertThat(givenProduct.getOrderNumber()).isEqualTo(1);
您可以将您的存储库模拟到 return 模拟列表:
public test() {
Product product1 = mock(Product.class);
Product product2 = mock(Product.class);
List list = Arraylist();
list.add(product1);
list.add(product2);
when(productRepositoryMock.findAllByUuidOrderByOrderNumber(uuid))
.thenReturn(list)
when(product1).setOrderNumber(captor.capture)
在这种情况下,您可以在这里使用 ArgumentCaptor,但我认为在这种情况下它是多余的,简单的验证调用就足够了
service.update(.....);
verify.(product1).setOrderNumber(value);
我有以下服务方式:
public CommandDTO update(UUID uuid, EmployeeRequest request) {
final List<Product> productList = productRepository
.findAllByUuidOrderByOrderNumber(uuid);
final List<UUID> uuidList = request.getUuidList();
for (int i = 0; i < uuidList.size(); i++) {
Product product = productList.get(i);
product.setOrderNumber(i + 1);
// how can I get the product value in this line?
}
return CommandDTO.builder().uuid(uuid).build();
}
通常,我使用 ArgumentCaptor
来获取传递给存储库或服务的值。但是,在此示例中,我想要在 product.setOrderNumber(i + 1);
之后获得的产品值未传递服务或存储库。由于这个原因,我无法得到它。我不确定是否可以使用 @Spy
或 doAnswer
,但据我所知,这些方法不能使用,因为值没有传递给服务或回购。有什么想法吗?
product
变量来自productList
,后者又来自repository.findAllByUuidOrderByOrderNumber()
方法。所以如果你模拟你的存储库,你可以这样写:
Product givenProduct = new Product();
UUID givenUUID = UUID.randomUUID();
// Create an EmployeeRequest with a `uuidList`
EmployeeRequest givenRequest = new EmployeeRequest(/* TODO */);
// Use Mockito to return a `productList` you choose
// This uses a static import of `Mockito.when()`
when(productRepository.findAllByUuidOrderByOrderNumber(givenUUID)).thenReturn(List.of(givenProduct));
service.updateRequest(givenUUID, givenRequest);
理论上你甚至可以在上面的测试逻辑中 return 模拟产品,但我建议使用真实的 Product
对象。
现在无论该产品发生什么,都可以在您的测试中断言。
例如:
// `givenProduct` is element 0, and thus will get an orderNumber of 1
assertThat(givenProduct.getOrderNumber()).isEqualTo(1);
您可以将您的存储库模拟到 return 模拟列表:
public test() {
Product product1 = mock(Product.class);
Product product2 = mock(Product.class);
List list = Arraylist();
list.add(product1);
list.add(product2);
when(productRepositoryMock.findAllByUuidOrderByOrderNumber(uuid))
.thenReturn(list)
when(product1).setOrderNumber(captor.capture)
在这种情况下,您可以在这里使用 ArgumentCaptor,但我认为在这种情况下它是多余的,简单的验证调用就足够了
service.update(.....);
verify.(product1).setOrderNumber(value);