Verhindern stubbing der equals-Methode
Ich würde gerne testen, meine Klasse' equals () - Methode, aber Mockito zu sein scheint Aufruf der stub-version jedes mal. Mein test ist wie folgt;
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);
Ich weiß, ich kann nicht stub die equals-Methode, was bedeutet, Mockito sein sollte ruft meine realen Umsetzung aber nicht.
Habe ich auch so probiert:
when (adapter.equals(any()).thenCallRealMethod()
aber ich bekomme das gleiche Ergebnis.
- Mockito automatisch überschreibt
equals
mit eigener Praxis, so dass er einen mock in Ihren internen Strukturen (HashMap
s oderTreeMap
s glaube ich), wenn es Bedürfnisse zu erfassen, dass eine Methode aufgerufen wurde, die auf einem mock. Dies ist von grundlegender Bedeutung für die Art, wie es funktioniert, das ist, warum es nicht zulassen, dass Sie Ihre eigenenequals
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sogar darüber hinaus Mockito Einschränkungen, es macht nicht viel Sinn für einen verspottet Objekt zu einem echten
equals
Methode, wenn aus keinem anderen Grund als dem, dass die equals-Methoden fast immer Felder verwenden, und verspottet Objekte nie ausführen jeder Ihrer Konstruktoren oder Feld-Initialisierungen.Auch, sich bewusst sein, was Sie testen wollen: In einem test der
Foo
im Idealfall sollten Sie nie verspottenFoo
auch die Einrichtung einerFoo
gegen vergleichen. Ansonsten, ist es einfach, versehentlich test, Mockito funktioniert, anstatt die Erprobung Ihrer eigenen Komponente Logik.Haben Sie ein paar Lösungen:
Als Garrett Hall erwähnt, erstellen von realen Objekten. Dies kann erfordern, factoring out "Daten-Objekte" aus den Diensten, die Sie verwenden, und Sie verspotten die Dienstleistungen während der Verwendung der realen Daten von Objekten. Dies ist wahrscheinlich eine gute Idee insgesamt.
Erstellen Sie eine manuelle mock oder gefälscht, indem bilden von Unterklassen PluginResourceAdapter oder die Umsetzung der relevanten Schnittstellen außerhalb von Mockito. Dies befreit Sie definieren alle Methoden benötigt, einschließlich
equals
undhashCode
.Erstellen Sie eine
equivalentTo
Methode, das ist nicht das gleiche wieequals
(und damit nicht so nützlich für die Karte oder Legen Sie Gegenstände, zum Beispiel), aber das hat mockable Semantik können Sie festlegen, auf Ihrem eigenen.Dies würde auch können Sie testen, wie
equivalentTo
frei mit einem mock, und haben einfachequals
Delegierten zu, dass vermutlich-gut-Umsetzung getestet.Ein Objekt extrahieren, dass die tests auf die Gleichheit, und spotten, dass. Sie können auch Guave ist
Äquivalenz
gibt, oder eineComparator
wo testen Siea.compareTo(b) == 0
.Beachten Sie, dass eine andere mögliche Problemumgehung—Spionage auf bestehende Instanzen—auch neu definieren Sie die
equals
undhashCode
und Ihnen nicht helfen hier.Wenn Sie möchten, testen Sie die real
equals
dann müssen Sie erstellen eine real Objekt, und rufen Sie dieequals
- Methode auf. Ich bin mir nicht sicher, warum Sie mit mocks.Standardmäßig equals() gibt true zurück, wenn das Objekt die gleiche Adresse im Speicher.
So
PluginResourceAdapter adapter;
PluginResourceAdapter other;
adapter = other = mock (PluginResourceAdapter.class);
gibt true zurück, zu Ihnen. Wenn Sie wollen, false verwenden
PluginResourceAdapter adapter = mock (PluginResourceAdapter.class);
PluginResourceAdapter other = mock (PluginResourceAdapter.class);