使用Mockito测试Java增强的行为

Hac*_*Gil 13 java unit-testing for-loop mockito

我想测试一个使用Mockito对其进行增强的java方法.问题是,当我不知道如何设置增强的工作期望.以下代码来自mockito google组中未解决的问题:

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);
  }
} 
Run Code Online (Sandbox Code Playgroud)

for循环中的代码永远不会被执行.设置迭代器的期望不起作用,因为java增强的内部不使用列表迭代器.设置List.get()方法的期望也不是因为实现的增强似乎也没有调用get()列表的方法.

任何帮助都感激不尽.

hoi*_*loi 25

嘲弄迭代器对我有用.见下面的代码示例:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)


And*_*ite 5

除非我遗漏了某些东西,否则你应该返回一个真实的模拟值列表.在这种情况下,在生成器方法中构造测试字符串列表并简单地返回它.在更复杂的情况下,您可以使用模拟对象替换列表的内容.

作为结束点,我无法想象为什么你真的需要模拟增强的for循环.单元测试的性质不适合该级别的检查.这是一个有趣的问题.