Prévenir stubbing de la méthode equals
Je voudrais tester ma classe' méthode equals() mais Mockito semble être l'appel de la stub de version à chaque fois. Mon test est comme suit;
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);
Je sais que je ne peut pas talon la méthode equals qui signifie Mockito devrait appeler mon réel de la mise en œuvre, mais ses pas.
J'ai aussi essayé ceci:
when (adapter.equals(any()).thenCallRealMethod()
mais j'obtiens le même résultat.
Mockito remplace automatiquement
equals
avec sa propre mise en œuvre, de sorte qu'il puisse trouver une fantaisie dans ses structures internes (HashMap
s ou TreeMap
s je crois) quand il a besoin d'enregistrer qu'une méthode a été appelée sur une maquette. Ce qui est fondamental pour la façon dont cela fonctionne, ce qui est pourquoi il ne vous permet pas de vous fournir votre propre equals
.OriginalL'auteur SJunejo | 2013-11-04
Vous devez vous connecter pour publier un commentaire.
Même au-delà de Mockito limites, il ne fait pas beaucoup de sens pour un moqué objet l'utilisation d'une
equals
méthode, si pour aucune autre raison que celle qui est égal à des méthodes presque toujours utiliser des champs, et se moque des objets n'exécutez jamais un de leurs constructeurs ou d'un champ d'initialiseurs.Aussi, être conscient de ce que vous faites des tests: un test de
Foo
, idéalement, vous ne devriez jamais se moquer deFoo
, même installer unFoo
à comparer. Sinon, il est facile de par inadvertance, test de Mockito œuvres, plutôt que de tester votre propre composant de logique.Vous avez quelques solutions de contournement:
Que Garrett Hall mentionné, créer des objets réels. Cela peut nécessiter l'affacturage les "objets de données" de la part des services qui les utilisent, et se moquant de la les services, tout en utilisant des données réelles des objets. C'est probablement une bonne idée d'ensemble.
Créer un manuel de maquette ou de faux-classement PluginResourceAdapter ou de mise en œuvre de l'interface à l'extérieur de Mockito. Cela vous permet de définir toutes les méthodes nécessaires, y compris
equals
ethashCode
.Créer un
equivalentTo
méthode, qui n'est pas le même queequals
(et donc n'est pas aussi utile pour une Carte ou un Ensemble d'objets, par exemple), mais qui a mockable sémantique que vous pouvez définir sur votre propre.Ce serait également vous permettre de tester
equivalentTo
librement avec un simulacre, et tout simplementequals
délégué qui, vraisemblablement,-bien testé la mise en œuvre.Extraire un objet qui teste l'égalité, et se moquer de qui. Vous pouvez également utiliser La goyave est
Équivalence
là, ou unComparator
où vous testeza.compareTo(b) == 0
.Notez que l'une des autres possibilités de contournement—espionnage sur les instances existanteségalement redéfinir
equals
ethashCode
et ne sera pas vous aider ici.OriginalL'auteur Jeff Bowman
Si vous voulez tester le réel
equals
alors vous avez besoin pour créer un réel objet et l'appel de laequals
méthode. Je ne suis pas sûr de savoir pourquoi vous utilisez des simulacres.OriginalL'auteur Garrett Hall
Par défaut est égale à() retourne true si l'objet ont la même adresse dans la mémoire.
Donc
PluginResourceAdapter adapter;
PluginResourceAdapter other;
adapter = other = mock (PluginResourceAdapter.class);
retourne true pour vous. Si vous voulez fausses utilisation
PluginResourceAdapter adapter = mock (PluginResourceAdapter.class);
PluginResourceAdapter other = mock (PluginResourceAdapter.class);
OriginalL'auteur InsFi