web-dev-qa-db-fra.com

Mockito peut-il remplacer une méthode sans tenir compte de l'argument?

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.

274
Eric Wilson
when(
  fooDao.getBar(
    any(Bazoo.class)
  )
).thenReturn(myFoo);

ou (pour éviter nulls):

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.*;
417

Utilisez comme ceci:

when(
  fooDao.getBar(
    Matchers.<Bazoo>any()
  )
).thenReturn(myFoo);

Avant de devoir importer Mockito.Matchers

15
user3975308

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.

13
Buhb