2013-08-02 3 views
1

Я пытаюсь использовать макет и проверять, что аргумент, переданный в макет, является правильным ArrayList<MyModel>. Я определил метод boolean equals на MyModel, но я не могу найти подходящий помощник, который использует метод equals. Матчи, которые я писал, сравнивают только с объектами object_id, которые явно отличаются друг от друга. Мой тест выглядит так:Hamcrest ArrayList matcher

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

Кто-нибудь знает Сличитель, который будет использовать булево равно на MyModel?

+0

Почему это не работает для вас? 'verify (activity) .handleSuccess (argThat (equalTo (expected)));' – aim

+0

@aim сравнивает object_id, и поскольку вызываемый аргумент является другим экземпляром 'ArrayList', сравнение равенств возвращает false. – trev9065

+2

Хм .. Я думал, что 'equalTo' вызывается равным на' ArrayList', а затем применяется к каждому элементу списка (например, этот 'java.util.AbstractList # equals') ... – aim

ответ

0

В соответствии с 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.equalsreflective, symmetric, transitive, and consistent? Маловероятно, что ваш equals потерпит неудачу в другом направлении, но нет гарантии, на какой объект будет вызываться метод equals.
  • Если два объекта равны, то их значения hashCode возвращают равные целые числа? Реализации коллекции - free to check hash code equality as a "shortcut" перед проверкой равенства между объектами.

Чтобы проверить это изделие, вы можете, пожалуйста, написать свой тест специально для equals. Я рекомендую Guava's EqualsTester, который автоматически проверяет большинство этих свойств.

Смежные вопросы