我正在尝试使用模拟并检查传递到模拟中的参数是否为正确的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)
和e1
的e2
。
仔细检查您是否已完成正确覆盖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
,它会自动为您检查大多数这些属性。