【问题标题】:How to mock for each loop properly using Mockito?如何使用 Mockito 正确模拟每个循环?
【发布时间】:2017-12-20 17:54:34
【问题描述】:

我想测试我的方法,我需要模拟 Items 和 Rows 的向量来遍历它们。

当我从 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
    }
}

【问题讨论】:

  • 可以分享一下使用mockedItem的测试代码吗?我宁愿怀疑它不在模拟服务中,而不是 doReturn 不起作用。
  • 能不能也把Row类的代码显示一下。
  • 我不确定我是否理解正确,但它没有在任何地方使用。在 doReturn 之后,我只调用服务,然后执行断言。
  • @StefanBirkner 没有什么特别之处——它只是创建了一些值的列表。无论如何,我期待 doReturn 根本不调用方法 getRows 并且应该总是返回相同的向量。我错了吗?
  • myMethod() 在哪里调用?您需要显示更多 MyService 类。因为我怀疑你没有正确注入模拟项目

标签: java testing junit mocking mockito


【解决方案1】:

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

您需要做的是创建 Item 的 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);
}

然后通过传递向量调用您测试的方法:

new MyService().myMethod(items);

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

【讨论】:

    猜你喜欢
    • 2022-09-22
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 2018-03-10
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    相关资源
    最近更新 更多