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

Java 验证是否调用了列表元素方法,java,unit-testing,junit,mockito,Java,Unit Testing,Junit,Mockito,如何验证在单元测试期间是否调用了列表元素的方法签名?对于下面的代码段,如何验证在使用ordermock对象进行验证时是否调用了item.getPrice() 实现代码段: public BigDecimal getTotalPrice(Order order) { BigDecimal totalPrice = BigDecimal.ZERO; for (Item item : order.getItems()) { totalPrice.add(item.get

如何验证在单元测试期间是否调用了列表元素的方法签名?对于下面的代码段,如何验证在使用
order
mock对象进行验证时是否调用了
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
}
单元测试代码段:

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
}
实现此单元测试场景的最佳方法是什么?

试试看

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

我真的不能使用
验证(order.getItems().get(anyInt()).getPrice()和result来验证for循环中的元素方法吗?如果是这样,为什么?
order.getItems()
在测试中返回的是一个实际的列表实现(项),而不是正在监视并可以验证的模拟。但是,列表中的项目是模拟的,可以进行验证。这也是
无效使用MatcherException
的原因
anyInt()
正在应用于一个具体的方法。