Предотвратить раскорчевка метод Equals
Я хотел бы протестировать свой метод Class ' equals (), но Mockito, кажется, вызывает версию заглушки каждый раз. Мой тест заключается в следующем;
PluginResourceAdapter adapter = mock (PluginResourceAdapter.class);
PluginResourceAdapter other = mock (PluginResourceAdapter.class);
when(adapter.getNumberOfEndpointActivation()).thenReturn(1);
when(other.getNumberOfEndpointActivation()).thenReturn(0);
boolean result = adapter.equals(other);
assertFalse(result);
Я знаю, что не могу заглушить метод equals, что означает, что Mockito должен вызывать мою реальную реализацию, но это не так.
Я также попробовал это:
when (adapter.equals(any()).thenCallRealMethod()
Но я получаю тот же результат.
3 ответа:
Даже за пределами ограничений Mockito, Это не имеет большого смысла для издевательского объекта использовать реальный метод
Кроме того, имейте в виду, что вы тестируете: в тестеequals, если только по этой причине методы equals почти всегда используют поля, и издевательские объекты никогда не запускают ни один из своих конструкторов или инициализаторов полей.Foo, в идеале, вы никогда не должны издеваться надFoo, даже чтобы настроитьFooДля сравнения. В противном случае легко непреднамеренно проверить, что Mockito работает, вместо того, чтобы проверять логику вашего собственного компонента.У вас есть несколько обходных путей:
Как уже упоминал Гаррет Холл, создавайте реальные объекты. Это может потребовать факторинга "объектов данных" из служб, которые их используют, и издевательства над службами при использовании реальных объектов данных. Это, вероятно, хорошая идея в целом.
Создайте ручной макет или подделку, подклассировав PluginResourceAdapter или реализовав соответствующий интерфейс за пределами Mockito. Этот позволяет определить все необходимые методы, включая
equalsиhashCode.Создайте метод
equivalentTo, который отличается от методаequals(и, следовательно, не так полезен для объектов Map или Set, например), но имеет поддельную семантику, которую вы можете определить самостоятельно.Это также позволит вам свободно тестировать
equivalentToс макетом и просто делегироватьequalsэтой предположительно хорошо протестированной реализации.- Извлеките объект, который проверяет равенство, и издевайтесь над ним. Вы также можете использовать гуаву.
Equivalenceтам, или вComparator, где вы тестируетеa.compareTo(b) == 0.class YourClass { class AdapterEquivalence { boolean adaptersAreEqual( PluginResourceAdapter a, PluginResourceAdapter b) { return a.equals(b); } } /** Visible for testing. Replace in tests. */ AdapterEquivalence adapterEquivalence = new AdapterEquivalence(); }Обратите внимание, что еще один потенциальный обходной путь - шпионаж за существующими экземплярами - также переопределит
equalsиhashCodeи здесь я тебе не помогу.
Если вы хотите проверить реальное
equalsзатем нужно создать реальный объект и вызвать для него методequals. Я не знаю, почему вы используете насмешки.
По умолчанию equals () возвращает true, если объект имеет тот же адрес в памяти.
Так чтоPluginResourceAdapter adapter; PluginResourceAdapter other; adapter = other = mock (PluginResourceAdapter.class);
возвращает вам истину. Если вы хотите ложного использованияPluginResourceAdapter adapter = mock (PluginResourceAdapter.class); PluginResourceAdapter other = mock (PluginResourceAdapter.class);