Hamcrest ArrayList matcher



我正在尝试使用mock,并检查传递到mock中的参数是否为正确的ArrayList<MyModel>。我已经在MyModel上定义了布尔equals方法,但我找不到使用equals方法的匹配器。我一直在写的匹配器只比较object_id,它们明显不同。我的测试看起来是这样的:

MainActivity activity = mock(MainActivity.class);
MyRequest subject = new MyRequest(activity);
ArrrayList<MyModel> list = ...;
subject.makeRequest();
verify(activity).handleSuccess(argThat(is(list)));

有人知道在MyModel上使用布尔等号的匹配器吗?

根据Hamcrest教程,您可以使用以下任何一项来使用Object.equals:进行比较

  • argThat(is(list))
  • argThat(is(equalTo(list))
  • argThat(equalTo(list))

此外,List.equals(Object)被具体定义为对列表中相应位置的每个元素e1e2e1.equals(e2)进行比较。

仔细检查您是否已经完成了正确覆盖equals:所需的所有操作

  • 您的MyModel.equals方法是否接收到Object参数而不是MyModel?如果参数是Object以外的任何类型,则它不是一个适当的覆盖,也不会起作用
  • MyModel.equals是否具有反射性、对称性、传递性和一致性?equals不太可能在另一个方向上失败,但不能保证equals方法会在哪个对象上被调用
  • 当两个对象相等时,它们的hashCode值是否返回相等的整数?集合实现可以在检查对象到对象的相等性之前,将哈希代码相等性作为"快捷方式"进行检查

要检查这些点,您可能需要专门为equals编写一个测试。我推荐Guava的EqualsTester,它会自动为您检查大多数属性。

最新更新