迭代器() 方法自动调用



我是Collection Java的新手,很抱歉,如果问题如此基本。

在调试 Shipping 类中的一段代码时。如果iterator()中的返回值为null则测试用例失败,但如果返回值products.iterator则测试用例通过。所以,我认为在 ShipmentTest 类中运行hasItem()时会自动调用 iterator() 方法。但奇怪的是,它是在没有从测试文件调用的情况下调用的,就像普通代码一样

Iterator itr = al.iterator();
while(itr.hasNext()) {
Object element = itr.next();
// do something....
}

并且返回类型hasItem()不返回与迭代器相关的值...

有谁经历过这个案例,能帮忙分享你的想法吗?

以下是代码:

装运测试类

import org.junit.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.IsCollectionContaining.hasItem;
public class ShipmentTest {
private Shipment shipment = new Shipment();
Product door = new Product("Door", 22);
Product windows = new Product("Windows", 10);
@Test
public void shouldAddItems() throws Exception {
shipment.add(door);
shipment.add(windows);
assertThat(shipment, hasItem(door));
}
}

货件类别

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Shipment implements Iterable<Product> {
private static final int LIGHT_VAN_MAX_WEIGHT = 20;
private List<Product> products = new ArrayList<>();
@Override
public Iterator<Product> iterator() {
return products.iterator();
}
public void add(Product p) {
products.add(p);
}
}

产品类别

public class Product {
private final String name;
private final int weight;
public Product(String name, int weight) {
this.name = name;
this.weight = weight;
}
public String getName() {
return name;
}
public int getWeight() {
return weight;
}
@Override
public String toString() {
return "Product{" +
"name='" + name + ''' +
", weight=" + weight +
'}';
}
}

是的,为了测试集合是否包含项目,IsCollectionContaining.hasItem调用iterator()。这是处理任何Iterable的完全正常的部分。(否则它如何判断货物是否包含特定物品?

最新更新