我想测试我的方法,我需要模拟项目和行的向量来遍历每个方法。
当我从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
}
}
答案 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是一个陈旧且有缺陷的集合
如果您不需要处理竞争条件,则用户可以List
和ArrayList
作为实施。