我是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
的完全正常的部分。(否则它如何判断货物是否包含特定物品?