Le code ci-dessous montre mon problème. Effectivement, j'essaie d'utiliser l'argumentCaptor de Mockito pour vérifier qu'une méthode a été appelée une fois avec une certaine classe de béton. J'aimerais utiliser ArgumentCaptor ici si possible, mais je commence à suspecter que je dois utiliser un argument personnalisé à la place.
Le problème est que la ligne éditer:
Pour toute personne intéressée, j'ai fini par faire ceci: p> mockito.verify (moqueur) .Receive (Captor.capture ( )); code> (Modifier: Ajout de cela au code ci-dessous) échoue avec une exception ToomanyActualIvocations (2 au lieu de 1). Je voudrais comprendre pourquoi cela se passe - est-ce une mauvaise mise en œuvre de Mockito ou une limitation causée par l'effacement des génériques de type? P>
3 Réponses :
La méthode sera appelée deux fois pour que vous ayez besoin de le faire:
Mockito.verify(mocked, times(2)).receive(captor.capture());
Merci pour la réponse. Je suppose que j'espérais que l'instance argumentcaptor code> filtrerait automatiquement la commande
vérifier () code> de la même manière que vous le feriez avec un correspondeur d'argument personnalisé qui fait une instance de chèque Pour la classe B.
Vous pouvez également utiliser Mockito.isa pour vérifier que l'argument est d'une classe spécifique: Mockito Javadoc P> P>
C'est ce que je cherchais! Est-ce que ce matcheur neuf?
Super! Pas sûr, je l'ai utilisé pendant un moment .. Je me souviens d'être aussi surpris que toi quand j'ai entendu parler de ça.
Autant que je puisse dire que ceci est une limitation / mauvaise mise en œuvre.
Lors de la recherche sur signifiant qu'il correspond à chaque argument / classe. P> Il en résulte org.mockito.internal.matchers.Capturingmatcher code> Il y a
org.mockito.internal.matchers.capturingmatcher # getallvalues code> retourner une liste
code> mais contenant en fait un
a code> et un
b résultant dans un
classcastexception code> pendant l'exécution lorsque vous essayez de les obtenir comme
B code>. p>
List<Object> arguments; // the invocations
// adds a new invocation
public void captureFrom(Object argument) {
// ...
this.arguments.add(argument);
// ...
}
// return the list of arguments, using raw types remove any compiler checks for validity,
// the returned List contains elements that are not of type T
public List<T> getAllValues() {
// ...
return new ArrayList<T>((List) arguments);
// ...
}