用界面模拟循环

时间:2016-06-01 16:44:45

标签: junit mockito powermock

我有这个包含接口的java代码。

ILocation<ILocation> contactLocations = fileSystem.getContactLocations();
for (ILocation location : contactLocations) {
    location.getType();
    ...
}

public interface ILocation{
    String getName();
    ...
}

public interface ILocationS<T extends ILocation> extends IListCollectionWrapper<T> {
    ...
}

public abstract interface IListCollectionWrapper<E>extends ICollectionWrapper<E>{
    public abstract List<E> getAsList();
}

ILocation<ILocation> contactLocations = fileSystem.getContactLocations();
for (ILocation locations : contactLocations) {
    ...
}

我使用Mockito,我尝试测试for循环的内容。

Iterator<ILocation> mockIterator = mock(Iterator.class);
Mockito.when(locations.iterator()).thenReturn(mockIterator);

Mockito.when(mockIterator.next()).thenReturn(location);

Mockito.when(location.getType()).thenReturn("test");

我从不输入de for loop

1 个答案:

答案 0 :(得分:0)

你没有正确地模仿迭代器的另一个重要方法hasNext。默认情况下,Mockito将为所有布尔类型的方法返回false,因此hasNext将始终为false,并且您永远不会进入for循环。

这是不像大多数Iterables那样模拟数据对象的一个​​很好的理由;使用真实的东西,或创建一个new ArrayList<ILocation>,填充它,并让你的模拟返回yourArrayList.iterator()