【问题标题】:Hamcrest ArrayList matcherHamcrest ArrayList 匹配器
【发布时间】:2013-08-02 18:37:36
【问题描述】:

我正在尝试使用模拟并检查传递给模拟的参数是否正确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 上使用布尔等于的匹配器?

【问题讨论】:

  • 为什么这对你不起作用? verify(activity).handleSuccess(argThat(equalTo(expected)));
  • @aim 它比较 object_id 的,因为被调用的参数是 ArrayList 的不同实例,所以相等比较返回 false。
  • 嗯.. 我认为equalToArrayList 上调用相等,然后它适用于列表的每个元素(如java.util.AbstractList#equals)...
  • @aim 我也这么认为,但它给了我同样的错误。
  • 为了清楚起见,发布失败消息。 equalTo 匹配器确实使用了对象的内置 equals 方法。请注意,ArrayList 的方法要求元素在两个列表中的顺序相同。

标签: java android mockito hamcrest


【解决方案1】:

根据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.equalsreflective, symmetric, transitive, and consistent吗?您的 equals 不太可能在另一个方向上失败,但无法保证将调用 equals 方法的对象。
  • 当两个对象相等时,它们的hashCode 值是否返回相等的整数?在检查对象到对象的相等性之前,集合实现是free to check hash code equality as a "shortcut"

要检查这些要点,您可能需要专门针对equals 编写测试。我推荐Guava's EqualsTester,它会自动为您检查大部分这些属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 2015-09-15
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多