我正在尝试使用模拟并检查传递到模拟中的参数是否为正确的ArrayList<MyModel>。我在equals上定义了布尔MyModel方法,但是找不到使用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上的布尔值等于?

最佳答案

根据the Hamcrest tutorial,您可以使用以下任意项来比较Object.equals


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


此外,专门定义了List.equals(Object)以比较列表中相应位置的每个元素e1.equals(e2)e1e2

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


您的MyModel.equals方法是否接收Object参数而不是MyModel?如果参数是Object以外的任何其他类型,则它不是适当的替代,将无法使用。
MyModel.equals reflective, symmetric, transitive, and consistent吗?您的equals不太可能在另一个方向失败,但是不能保证equals方法将在哪个对象上调用。
当两个对象相等时,它们的hashCode值是否返回相等的整数?在检查对象到对象的相等性之前,集合实现是free to check hash code equality as a "shortcut"


要检查这些要点,您可能需要编写一个专门针对equals的测试。我建议使用Guava's EqualsTester,它会自动为您检查大多数这些属性。

09-10 06:32
查看更多