上一個答案是有效的。但是,如果您可以模擬Iterable而不是ItemCollection,那麼您的生活將變得更加簡單。
Iterable<Item> mockItemCollection = createMock(Iterable.class);
Iterator<Item> mockIterator = createMock(Iterator.class);
Item mockItem = new Item().with("attributeName", "Hello World");
expect(mockItemCollection.iterator()).andReturn(mockIterator);
expect(mockIterator.hasNext()).andReturn(true).andReturn(false);
expect(mockIterator.next()).andReturn(mockItem);
replay(mockItemCollection, mockIterator);
for(Item i : mockItemCollection) {
assertSame(i, mockItem);
}
verify(mockItemCollection, mockIterator);
順便說一句,我是靜態進口的粉絲,至少在測試代碼中。它使它更具可讀性。
閱讀AWS代碼,我會考慮他們的代碼有一個設計缺陷。從公共接口返回一個包範圍類沒有任何意義。這可能是應該作爲一個問題向他們提出的問題。
你也可以隨時換行ItemCollection成正確類型類:
public class ItemCollectionWrapper<R> implements Iterable<Item> {
private ItemCollection<R> wrapped;
public ItemCollectionWrapper(ItemCollection<R> wrapped) {
this.wrapped = wrapped;
}
public Iterator<Item> iterator() {
return wrapped.iterator();
}
}
只是想指出,'IteratorSupport'不再打包保護,所以它可以直接嘲笑。 – Max