J'ai une méthode privée dans ma classe de test qui construit un Bar
objet couramment utilisé . Le Bar
constructeur appelle la someMethod()
méthode dans mon objet simulé:
private @Mock Foo mockedObject; // My mocked object
...
private Bar getBar() {
Bar result = new Bar(mockedObject); // this calls mockedObject.someMethod()
}
Dans certaines de mes méthodes de test, je souhaite vérifier someMethod
que ce test particulier a également été invoqué. Quelque chose comme ce qui suit:
@Test
public void someTest() {
Bar bar = getBar();
// do some things
verify(mockedObject).someMethod(); // <--- will fail
}
Cela échoue car l'objet simulé a été someMethod
invoqué deux fois. Je ne veux pas que mes méthodes de test se soucient des effets secondaires de ma getBar()
méthode, donc serait-il raisonnable de réinitialiser mon objet fictif à la fin de getBar()
?
private Bar getBar() {
Bar result = new Bar(mockedObject); // this calls mockedObject.someMethod()
reset(mockedObject); // <-- is this OK?
}
Je demande, parce que la documentation suggère que réinitialiser des objets fictifs est généralement révélateur de mauvais tests. Cependant, cela me convient.
Alternative
Le choix alternatif semble appeler:
verify(mockedObject, times(2)).someMethod();
ce qui à mon avis oblige chaque test à connaître les attentes de getBar()
, sans aucun gain.
Mockito.clearInvocations(T... mocks)
Extrait des documents mockito .
Mon conseil est que vous essayez d'éviter d'utiliser
reset()
. À mon avis, si vous appelez deux fois à une méthode, cela doit être testé (il s’agit peut-être d’un accès à une base de données ou d’un autre processus long dont vous souhaitez prendre soin).Si cela vous est égal, vous pouvez utiliser:
Notez que ce dernier risque de générer un résultat faux, si vous appelez someMethod depuis getBar, et non après (il s’agit d’un comportement incorrect, mais le test n’échouera pas).
la source
verify
ma méthode privée (ce qui, j'en conviens, n'appartient probablement pas à cette méthode). Je me réjouis de vos commentaires pour savoir si votre réponse changerait.Absolument pas. Comme c'est souvent le cas, la difficulté que vous rencontrez lors de la rédaction d'un test vierge est un signal d'alarme majeur pour la conception de votre code de production. Dans ce cas, la meilleure solution consiste à refactoriser votre code afin que le constructeur de Bar n'appelle aucune méthode.
Les constructeurs doivent construire et non exécuter la logique. Prenez la valeur de retour de la méthode et transmettez-la en tant que paramètre constructeur.
devient:
Si cela devait entraîner la duplication de cette logique à plusieurs endroits, envisagez de créer une méthode fabrique pouvant être testée indépendamment de votre objet Bar:
Si cette refactorisation est trop difficile, utiliser reset () est un bon moyen de contourner le problème. Mais soyons clairs: cela indique que votre code est mal conçu.
la source