处理期望使用EasyMock模拟的不同输入和输出的函数

时间:2014-04-18 13:19:44

标签: unit-testing junit easymock

函数im测试通过不同的输入调用函数findByNames并期望不同的输出。我需要使用服务uDao来模拟它。那么我应该写两个不同的期望吗?但它不起作用......我该如何处理这种情况?

  EasyMock.expect(uDao.findByNames(CollectionUtils.newArrayList(target1Username)))
                .andReturn(CollectionUtils.newArrayList(target1Group)).once();
 //code in between
 EasyMock.expect(uDao.findByNames(CollectionUtils.newArrayList(target1Username, ownerUsername)))
         .andReturn(CollectionUtils.newArrayList(target1Group, ownerGroup));

/*target1Username, ownerUsername are strings and target1Group,
   ownerGroup are of class    UserGroup
*/

1 个答案:

答案 0 :(得分:0)

您的失败讯息:

<failure message="java.lang.AssertionError: Unexpected method call
     findByNames([elementsuser1@elements.com, owner@owner.com]): 
     findByNames([elementsuser1@elements.com, owner@owner.com]): expected: 1, actual: 0" 

意味着传入的集合不相等。

EasyMock使用对象相等来测试参数是否匹配。既然您说第一次调用findByNames有效(使用Collection<String>)而第二次调用(使用Collection<UserGroup>)失败,我猜测问题就在于{{1 }。class。

传入的集合的UserGroup似乎具有与预期相同的toString()值,因此:

  1. toString()方法检查未设置为相等值或
  2. 的其他字段
  3. UserGroup.equals()未定义equals方法,因此使用默认的相等性检查。默认的equals方法只说对象是相同的,如果它们是相同的引用。因此具有相同值的两个不同实例将不相等。或
  4. (不太可能)UserGroup返回的Collection未正确实现equals。我将假设此方法来自第三方库并正确实现。我只是把这个放在这里,其他2个场景不能解决问题。