我有以下服務方法:
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);不是通過服務或存盤庫。出于這個原因,我無法得到它。我不確定是否可以使用@Spyor doAnswer,但據我所知,這些方法不能使用,因為值沒有傳遞給服務或 repo。任何的想法?
uj5u.com熱心網友回復:
您可以模擬您的存盤庫以回傳模擬串列:
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);
uj5u.com熱心網友回復:
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);
理論上你甚至可以在上面的測驗邏輯中回傳一個模擬的產品,但我建議使用一個真實的Product物件。
現在,無論該產品發生什么,都可以在您的測驗中斷言。
例如:
// `givenProduct` is element 0, and thus will get an orderNumber of 1
assertThat(givenProduct.getOrderNumber()).isEqualTo(1);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/477129.html
