验证是否调用列表元素方法



如何验证列表元素的方法签名是否在单位测试中调用?对于下面的代码段,如何验证使用order模拟对象验证时是否调用item.getPrice()

实施代码段:

public BigDecimal getTotalPrice(Order order) {
    BigDecimal totalPrice = BigDecimal.ZERO;
    for (Item item : order.getItems()) {
        totalPrice.add(item.getPrice());
    }
    return totalPrice;
}

单元测试代码段:

@Test
public void testTotalPrice() {
    List<Item> items = new ArrayList<>();
    for (BigDecimal price : prices) {
        Item item = mock(Item.class);
        when(item.getPrice()).thenReturn(price);
        items.add(item);
    }
    Order order = mock(Order.class);
    when(order.getItems()).thenReturn(items)
    BigDecimal totalPrice = orderHandler.getTotalPrice(order);
    verify(order, atLeastOnce()).getItems();
    verify(order.getItems().get(anyInt()), atLeastOnce()).getPrice();
    // assert
}

测试总是失败,在这里stacktrace(片段);

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Misplaced argument matcher detected here:
-> // pointing to this line : verify(order.getItems().get(anyInt()), atLeastOnce()).getPrice();

实施此单元测试方案的最佳方法是什么?

尝试

//...other code removed for brevity
for (Item item : items) {
    verify(item, atLeastOnce()).getPrice();
}

最新更新