模拟列表的Mockito问题

par*_*ars 0 java mockito

我想模拟一个列表

private Item populateData(Item i) {
    List<Person> groupIdList = xyzDao.getData(id);
    for (Person p: groupIdList) {

    }
}
Run Code Online (Sandbox Code Playgroud)

我想通过模拟groupIdList来测试函数如何执行此操作?

Tom*_*icz 5

官方的Mockito文档有点误导.你不应该模拟列表(没有太多逻辑的数据容器),你应该模拟行为.在你的情况下xyzDao.getData(id)是行为.模拟xyzDao并返回一些虚假数据:

//given
XyzDao xyzDaoMock = mock(xyzDao);
//inject to XyzService class under test
given(xyzDaoMock.getData(id)).willReturn(Arrays.asList(...));

//when
xyzService.populateData()  //...XyzService uses mocked XyzDao

//then
Run Code Online (Sandbox Code Playgroud)

随后部分,您应该要么verify()xyzDao被称为或使返回确认正确的列表.很难根据您的代码段告诉您需要什么.

  • +1为一个好的答案.值得注意的是,如果您正在使用`getData()`,那么您提供的返回值可能会在测试后期使用.如果不是,你就不会打扰它; 但如果是,那么如果`getData()`没有被调用,那么你正在测试的条件就不会成真.因此,为了使您的测试简单,不要将其存根,或者不"验证"它 - 依赖于其他一些断言来证明该值被恰当地使用.对于你已经存根的方法使用`verify`的唯一真正原因是,如果你想声明它只被称为ON ON ONCE. (2认同)