Mockito - Stubbing une méthode d'un objet qui a été renvoyée par un objet fantaisie méthode
Disons que j'ai un objet fantaisie, et je ne veux pas stub l'un de ses méthodes, mais je veux stub une méthode d'un objet auquel il renvoie. Par exemple,
when(mockObject.method1()).thenReturn(returnValue)
est de savoir comment il est fait normalement, mais je suis à la recherche d',
when(mockObject.method1().method2()).thenReturn(returnValue)
Est-ce possible? Je reçois un NullPointerException si je le fais. Actuellement, j'ai stub la première méthode retourne un objet fantaisie, et puis en utilisant renvoyé l'objet fantaisie, talon de la deuxième méthode. Cependant, ces objets fantaisie sont inutiles pour moi et après le chaînage de plusieurs méthodes, que des résultats en beaucoup d'inutiles les objets fantaisie.
EDIT: en Fait, il est possible que le chaînage des œuvres, mais mes objets sont à l'origine de la NPE. Ce code (la première ligne) est à l'origine un NPE:
when(graphDb.index().getNodeAutoIndexer()).thenReturn(nodeAutoIndexer);
when(graphDb.index().getRelationshipAutoIndexer()).thenReturn(relAutoIndexer);
Mais ce code fonctionne:
IndexManager indexManager = mock(IndexManager.class);
when(graphDb.index()).thenReturn(indexManager);
when(indexManager.getNodeAutoIndexer()).thenReturn(nodeAutoIndexer);
when(graphDb.index().getRelationshipAutoIndexer()).thenReturn(relAutoIndexer);
Donc le chaînage n'a pas fonctionné pour getNodeAutoIndexer() qui retourne un AutoIndexer objet alors qu'il travaillait pour getRelationshipAutoIndexer() qui retourne un RelationshipAutoIndexer. Les deux valeurs de retour sont moqués comme suit:
nodeAutoIndexer = (AutoIndexer<Node>) mock(AutoIndexer.class);
relAutoIndexer = mock(RelationshipAutoIndexer.class);
Alors, quelle pourrait être l'origine du problème?
OriginalL'auteur gsingh2011 | 2011-10-29
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de problème.
Examinons ces 4 lignes de code:
La première ligne crée un simulacre de indexManager.
La deuxième raconte la maquette graphDb de retour indexManager (le fictif créé lors de la première ligne) lorsque l'indice de la méthode est appelée.
Le troisième telle la maquette indexManager (créé à la première ligne) pour revenir nodeAutoIndexer lors de son getNodeAutoIndexer méthode est appelée.
Et la dernière ligne appels graphDb.index(), qui retourne la maquette indexManager (vous lui avez dit de le faire à la ligne deux), et demande à ce indexManager (qui est la maquette que vous avez créé à la première ligne) pour revenir relAutoIndexer lors de son getRelationshipAutoIndexer méthode est appelée.
La dernière ligne ne fonctionne que parce que vous avez dit la maquette graphDb quoi retourner lorsque son indice de la méthode est appelée. Si vous n'avez pas fait cela avant, la maquette graphDb.méthode index() aurait retourné null et vous auriez eu un NPE.
Pas de. La valeur de retour par défaut est null pour les méthodes qui retournent des objets. À mon humble avis, le problème que vous rencontrez est un signe que vous enfreignez la loi de Déméter : ne pas parler aux étrangers.
Notez que mockito offre une profonde stub fonctionnalité (
mock(LegacyType.class, RETURNS_DEEP_STUBS)
), mais de décourager son utilisation car vous risquez de vous casser bon design lois, comme la Loi de Déméter. Veuillez noter que cette fonctionnalité ne fonctionne pas encore avec les types génériques, par exemple une Liste.Merci Brice. Je ne savais pas à ce sujet, et cela pourrait résoudre le cas des OP problème.
Le RETURNS_DEEP_STUBS n'a résoudre le problème.
OriginalL'auteur JB Nizet