本文介绍了如何使用 Mockito 模拟 forEach 行为的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想做以下工作,但我不知道如何正确模拟 forEach 行为.(代码取自相关问题使用 Mockito 测试增强行为的 Java )
@Test
public void aa() {
Collection<String> fruits;
Iterator<String> fruitIterator;
fruitIterator = mock(Iterator.class);
when(fruitIterator.hasNext()).thenReturn(true, true, true, false);
when(fruitIterator.next()).thenReturn("Apple")
.thenReturn("Banana").thenReturn("Pear");
fruits = mock(Collection.class);
when(fruits.iterator()).thenReturn(fruitIterator);
doCallRealMethod().when(fruits).forEach(any(Consumer.class));
// this doesn't work (it doesn't print anything)
fruits.forEach(f -> {
mockObject.someMethod(f);
});
// this works fine
/*
int iterations = 0;
for (String fruit : fruits) {
mockObject.someMethod(f);
}
*/
// I want to verify something like this
verify(mockObject, times(3)).someMethod(anyString());
}
推荐答案
Collection
接口的方法forEach
是一个防御者"方法;它不使用Iterator
,而是调用传递给方法的Consumer
.
如果你使用的是Mockito 2+版本(*),你可以要求调用Collection
接口的默认方法forEach
:
Mockito.doCallRealMethod().when(fruits).forEach(Mockito.any(Consumer.class));
(*): Mockito 从版本 2 开始增加了支持 Java 8 默认(defender")方法的可能性 - 你可以检查跟踪问题 这里.
(*): Mockito has added the possibility to support Java 8 default ("defender") method since version 2 - you can check the tracking issue here.
这篇关于如何使用 Mockito 模拟 forEach 行为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!