9
votes

Utiliser la classe ArgumentCaptor de Mockito pour correspondre à une classe enfant

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 mockito.verify (moqueur) .Receive (Captor.capture ( )); (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? xxx

éditer: Pour toute personne intéressée, j'ai fini par faire ceci: xxx


0 commentaires

3 Réponses :


1
votes

La méthode sera appelée deux fois pour que vous ayez besoin de le faire:

Mockito.verify(mocked, times(2)).receive(captor.capture());


1 commentaires

Merci pour la réponse. Je suppose que j'espérais que l'instance argumentcaptor filtrerait automatiquement la commande vérifier () 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.



7
votes

Vous pouvez également utiliser Mockito.isa pour vérifier que l'argument est d'une classe spécifique: xxx

Mockito Javadoc


2 commentaires

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.



6
votes

Autant que je puisse dire que ceci est une limitation / mauvaise mise en œuvre. Lors de la recherche sur org.mockito.internal.matchers.Capturingmatcher code> Il y a xxx pré>

signifiant qu'il correspond à chaque argument / classe. P>

Il en résulte 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);
    // ... 
}


0 commentaires