【问题标题】:Mock object creation inside a method在方法内创建模拟对象
【发布时间】:2010-09-21 22:48:58
【问题描述】:

如果我有以下方法:

public void handleUser(String user) {

    User user = new User("Bob");
    Phone phone = userDao.getPhone(user);
    //something else
}

当我使用 EasyMock 使用 mock 进行测试时,是否可以像这样测试传递给我的 UserDao 模拟的 User 参数:

User user = new User("Bob");
EasyMock.expect(userDaoMock.getPhone(user)).andReturn(new Phone());

当我尝试运行上述测试时,它抱怨我假设的意外方法调用,因为在该方法中创建的实际用户与我传入的用户不同......我对此是否正确?

或者是我可以测试我传递给 UserDao 的参数的最严格的方法是:

EasyMock.expect(userDaoMock.getPhone(EasyMock.isA(User.class))).andReturn(new Phone());

【问题讨论】:

  • 你的User 类有equals 方法吗?

标签: unit-testing mocking easymock


【解决方案1】:

您是正确的,因为User 对象在对getPhone 的预期调用和实际调用之间存在差异,所以引发了意外的方法调用。

正如@laurence-gonsalves 在评论中提到的那样,如果User 有一个有用的equals 方法,您可以在对getPhone 的预期调用中使用EasyMock.eq(mockUser),这应该检查它是否是两个User 对象是平等的。

查看EasyMock Documentation,特别是“使用参数匹配器的灵活期望”部分。

【讨论】:

  • 因此,如果我为 User 实现 equals 方法,我是否可以传入我的 userMock,或者我仍然必须像您建议的那样使用 EasyMock.eq(mockUser) 以及实现的 equals ?
  • 如果 User equals 方法比较名称 (Bob),然后通过 User mockUser = new User("Bob"); 创建预期的方法; EasyMock.expect(userDaoMock.getPhone(EasyMock.eq(mockUser))).andReturn(new Phone());应该工作
【解决方案2】:

你可以使用

EasyMock.expect(userDaoMock.getPhone(EasyMock.anyObject())).andReturn(new Phone());

我认为这应该可以解决您的问题。

【讨论】:

    【解决方案3】:

    Yeswanth Devisetty 给出的答案略有变化

    EasyMock.expect(userDaoMock.getPhone(EasyMock.anyObject(User.class))).andReturn(new Phone());

    这样就可以解决问题了。

    【讨论】:

      猜你喜欢
      • 2017-01-15
      • 1970-01-01
      • 2014-12-06
      • 1970-01-01
      • 2017-11-06
      • 1970-01-01
      • 1970-01-01
      • 2021-02-06
      • 1970-01-01
      相关资源
      最近更新 更多