【问题标题】:How to create a mock of list of a custom data type in Mockito?如何在 Mockito 中创建自定义数据类型列表的模拟?
【发布时间】:2014-06-17 07:29:45
【问题描述】:

我有一个具有以下定义的类用户:

class User {

  Integer id;
  String name;
  String addr;

  //getters and setters

}

现在在测试一个函数时,我需要为一个存根返回一个模拟用户列表,例如:

Mockito.when(userService.getListOfUsers()).thenReturn(mockList);

现在这个 mockList 可以创建如下:

List mockList = Mockito.mock(ArrayList.class);

但是这个 mockList 可以是任何东西的列表。我无法确定它的类型。有没有办法创建列表:

List<User> mockListForUser = Mockito.mock(?);

【问题讨论】:

    标签: java unit-testing mockito


    【解决方案1】:

    您可能希望使用您的模拟对象填充一个普通列表。例如

    List<User> mockList = new ArrayList<>();
    
    User mockUser1 = Mockito.mock(User.class);
    // ...    
    
    mockList.add(mockUser1);
    // etc.
    

    请注意,默认情况下,Mockito 会为任何返回集合的模拟方法返回一个空集合。因此,如果您只想返回一个空列表,Mockito 已经为您完成了。

    【讨论】:

    • 所以基本上我不能用这个实现对列表进行验证?
    • @Sourabh 你想验证什么?
    • 如果我有一个服务可以在我刚刚使用 when().thenReturn() 返回的模拟列表上工作,我可能想要验证列表上的交互。
    • @Sourabh 关心服务如何使用列表可能不是一个好主意。相反,检查服务方法的结果(这可能涉及测试以查看列表中的每个项目是否发生了某些事情)。
    • @Sourabh 想象一下参加有关制作意大利面的考试。教练会给你一些配料,并根据最后一道菜的味道来评判你。他不在乎你按什么顺序切配料,但他在乎你生产什么。与模拟类似 - 只测试 just enough 以确保您的结果是正确的。关心列表的使用方式就像关心切菜一样。
    【解决方案2】:

    在您的测试中使用 @Mock 注释,因为 Mockito 可以使用类型反射:

    @Mock
    private ArrayList<User> mockArrayList;
    

    【讨论】:

    • 这不是 List mockArrayList = Mockito.mock(ArrayList.class) 吗?
    • 粗略地说,除了它更性感而且你不处理你的问题类型:你让 Mockito 为你做。
    • 好的,我也可以在类方法中进行此类声明还是必须将其设为类变量?
    • @Vakh Ha!大多数人都追求“优雅”,我喜欢你认为它“性感”。
    • @Duncan 有时甚至可能很热 ;-)
    猜你喜欢
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    相关资源
    最近更新 更多