我想使用Mockito测试具有增强功能的Java方法。问题是,当我不知道如何设定增强功能的期望时。以下代码是从嘲笑谷歌组中的一个未解决的问题得到的:
import static org.mockito.Mockito.when; import static org.testng.Assert.assertTrue; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.mockito.Mockito; import org.testng.annotations.Test; public class ListTest { @Test public void test() { List<String> mockList = Mockito.mock(List.class); Iterator<String> mockIterator = Mockito.mock(Iterator.class); when(mockList.iterator()).thenReturn(mockIter); when(mockIter.hasNext()).thenReturn(true).thenReturn(false); when(mockIter.next()).thenReturn("A"); boolean flag = false; for(String s : mockList) { flag = true; } assertTrue(flag); } }
for循环内的代码永远不会执行。为迭代器设置期望值不起作用,因为for的Java增强功能在内部未使用列表迭代器。为List.get()方法设置期望也不会,因为增强的实现似乎也不会调用get()列表的方法。
List.get()
get()
任何帮助都感激不尽。
模拟迭代器对我有用。参见下面的代码示例:
import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.util.Collection; import java.util.Iterator; import org.junit.Before; import org.junit.Test; public class TestMockedIterator { private Collection<String> fruits; private Iterator<String> fruitIterator; @SuppressWarnings("unchecked") @Before public void setUp() { 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); } @Test public void test() { int iterations = 0; for (String fruit : fruits) { iterations++; } assertEquals(3, iterations); } }