J'essaie de tester certains codes existants, en utilisant Mockito.
Je souhaite remplacer un FooDao
utilisé dans la production comme suit:
foo = fooDao.getBar(new Bazoo());
Je peux écrire:
when(fooDao.getBar(new Bazoo())).thenReturn(myFoo);
Mais le problème évident est que getBar()
n'est jamais appelé avec le même objet Bazoo
pour lequel j'ai stubé la méthode. (Malédiction de cet opérateur new
!)
J'adorerais si je pouvais modifier la méthode de manière à ce qu'elle retourne myFoo
quel que soit l'argument. À défaut, j'écouterai d'autres solutions de contournement, mais j'aimerais vraiment éviter de changer le code de production jusqu'à ce que la couverture de test soit raisonnable.
when(
fooDao.getBar(
any(Bazoo.class)
)
).thenReturn(myFoo);
ou (pour éviter null
s):
when(
fooDao.getBar(
(Bazoo)notNull()
)
).thenReturn(myFoo);
N'oubliez pas d'importer des correspondants (beaucoup d'autres sont disponibles):
Pour Mockito 2.1.0 et plus récent:
import static org.mockito.ArgumentMatchers.*;
Pour les anciennes versions:
import static org.mockito.Matchers.*;
Utilisez comme ceci:
when(
fooDao.getBar(
Matchers.<Bazoo>any()
)
).thenReturn(myFoo);
Avant de devoir importer Mockito.Matchers
http://site.mockito.org/mockito/docs/1.10.19/org/mockito/Matchers.html
anyObject devrait répondre à vos besoins.
En outre, vous pouvez toujours envisager d'implémenter hashCode et equals pour la classe Bazoo. Cela ferait que votre exemple de code fonctionne comme vous le souhaitez.