如何使用Mockito正确模拟每个循环?

时间:2017-12-20 17:54:35

标签: java testing junit mocking mockito

我想测试我的方法,我需要模拟项目和行的向量来遍历每个方法。

当我从Item类(在测试中)调用getRows()时,我准备了我想要得到的结果向量。

问题是测试中getRows方法的结果总是为空,因此这意味着doReturn语句在这里无法正常工作。

我错了什么?

class MyServiceTest {
@Mock
private Item mockedItem;

@Mock
private Row mockedRow;

@InjectMocks
@Spy
private MyService myService;

@Test
public void testMyMethod() {
    Vector<Row> rows = new Vector<Row>();
    Row row = new Row();
    rows.add(row);

    doReturn(rows).when(mockedItem).getRows();

    ...
    //some code to test the service

    }
}

class MyService {
    protected SomeObject myMethod(Vector<Item> items) {     
        for(Item item : items) {
            for(Row row : item.getRows()) {
               //cannot get here while debugging the test

               //some code
            }
        }
    ...
    }
}
class Item {
...
    public Vector<Row> getRows(){
       //return some vector of rows
    }
}

1 个答案:

答案 0 :(得分:4)

@InjectMock没用,因为模拟的矢量是测试方法的参数,而不是被测试类的字段。
所以你需要注入任何东西。

您需要做的是创建一个Vector项,其中每个元素都是一个模拟,其中包含getRows()的预期行为:返回存根行。

以下是示例代码:

// create stubbed rows
Vector<Row> rows = new Vector<Row>();
Row row = new Row();
rows.add(row);

// mock items Vector
Vector<Item> items = new Vector<>();
for (...){ // nb element to create
  Item mockedItem = Mockito.mock(Item.class);
  doReturn(rows).when(mockedItem).getRows();
  items.add(mockedItem);
}

然后通过传递vector:

来调用测试方法
new MyService().myMethod(items);

请注意,Vector是一个陈旧且有缺陷的集合 如果您不需要处理竞争条件,则用户可以ListArrayList作为实施。