J'ai un appel de méthode dont je veux me moquer avec mockito. Pour commencer, j'ai créé et injecté une instance d'un objet sur lequel la méthode sera appelée. Mon objectif est de vérifier l'un des objets dans l'appel de méthode.
Existe-t-il un moyen que mockito vous permet d'affirmer ou de vérifier l'objet et ses attributs lorsque la méthode mock est appelée?
exemple
Mockito.verify(mockedObject)
.someMethodOnMockedObject(
Mockito.<SomeObjectAsArgument>anyObject())
Au lieu de faire, anyObject()
je veux vérifier que cet argument contient des champs particuliers
Mockito.verify(mockedObject)
.someMethodOnMockedObject(
Mockito.<SomeObjectAsArgument>**compareWithThisObject()**)
Réponses:
La nouvelle fonctionnalité ajoutée à Mockito rend cela encore plus facile,
Jetez un œil à la documentation Mockito
Dans le cas où il existe plusieurs paramètres et que la capture d'un seul paramètre est souhaitée, utilisez d'autres ArgumentMatchers pour encapsuler le reste des arguments:
la source
Je pense que la façon la plus simple de vérifier un objet argument est d'utiliser la
refEq
méthode:Il peut être utilisé même si l'objet n'est pas implémenté
equals()
, car la réflexion est utilisée. Si vous ne souhaitez pas comparer certains champs, ajoutez simplement leurs noms comme arguments pourrefEq
.la source
Une autre possibilité, si vous ne souhaitez pas utiliser
ArgumentCaptor
(par exemple, parce que vous utilisez également le stubbing), est d'utiliser Hamcrest Matchers en combinaison avec Mockito.la source
Matchers
package est correct, car l'écriture de la même ligne de code avec laorg.mockito.Matchers
classe lève une exception trompeuse indiquant que le paramètre de la fonction de simulation ne correspond tout simplement pas.MockitoHamcrest.argThat()
et nonMockito.argThat()
Cette réponse est basée sur la réponse de iraSenthil mais avec une annotation ( Captor ). À mon avis, cela présente certains avantages:
Exemple:
la source
captor.getAllValues()
. La méthodecaptor.getValue()
utilisée dans la réponse fournit le dernier résultat.Si vous utilisez Java 8, vous pouvez utiliser des expressions Lambda pour correspondre.
Exemple d'appel
Plus d'infos: http://source.coveo.com/2014/10/01/java8-mockito/
la source
Les solutions ci-dessus n'ont pas vraiment fonctionné dans mon cas. Je ne pouvais pas utiliser ArgumentCaptor car la méthode était appelée plusieurs fois et j'avais besoin de valider chacune. Un simple Matcher avec "argThat" a fait l'affaire facilement.
Matcher personnalisé
Test Runner
la source
Et une solution très agréable et propre en koltin de
com.nhaarman.mockito_kotlin
la source
Vous pouvez consulter les éléments suivants:
Cela vérifiera si la méthode de mockedObject est appelée avec le paramètre desireObject comme paramètre.
la source
Un autre moyen simple de le faire:
la source
Le javadoc pour refEq a mentionné que le contrôle d'égalité est superficiel! Vous pouvez trouver plus de détails sur le lien ci-dessous:
[ https://static.javadoc.io/org.mockito/mockito-core/2.2.29/org/mockito/ArgumentMatchers.html#refEq T,%20java.lang.String...) Riverline1]
Le problème "d'égalité superficielle" ne peut pas être contrôlé lorsque vous utilisez d'autres classes qui n'implémentent pas la méthode .equals (), la classe "DefaultMongoTypeMapper" est un exemple où la méthode .equals () n'est pas implémentée.
org.springframework.beans.factory.support propose une méthode qui peut générer une définition de bean au lieu de créer une instance de l'objet, et elle peut être utilisée pour supprimer les échecs de comparaison.
** "La définition du bean n'est qu'une description du bean, pas un bean lui-même. Les descriptions du bean implémentent correctement equals () et hashCode (), donc plutôt que de créer un nouveau DefaultMongoTypeMapper () nous fournissons une définition qui indique au printemps comment il devrait en créer un "
Dans votre exemple, vous pouvez faire quelque chose comme ça
la source
Une solution simplifiée, sans créer de nouvelle classe d'implémentation Matcher et sans utiliser l'expression lambda:
la source