J'ai essayé de simuler une méthode avec des paramètres vararg en utilisant Mockito:
interface A {
B b(int x, int y, C... c);
}
A a = mock(A.class);
B b = mock(B.class);
when(a.b(anyInt(), anyInt(), any(C[].class))).thenReturn(b);
assertEquals(b, a.b(1, 2));
Cela ne fonctionne pas, mais si je fais cela à la place:
when(a.b(anyInt(), anyInt())).thenReturn(b);
assertEquals(b, a.b(1, 2));
Cela fonctionne, même si j'ai complètement omis l'argument varargs lors du stub de la méthode.
Des indices?
java
mocking
variadic-functions
mockito
qualificatif
la source
la source
Réponses:
Mockito 1.8.1 a introduit le matcher anyVararg () :
Consultez également l'historique pour cela: https://code.google.com/archive/p/mockito/issues/62
Modifiez la nouvelle syntaxe après la désapprobation:
la source
anyVararg()
a Object comme type de retour. Pour le rendre compatible avec tous les types var arg (par exemple, String ..., Integer ..., etc.), effectuez un cast explicite. Par exemple, si vous avez,doSomething(Integer number, String ... args)
vous pouvez faire le code simulé / stub avec quelque chose commewhen(mock).doSomething(eq(1), (String) anyVarargs())
. Cela devrait résoudre l'erreur de compilation.Matchers
est désormais obsolète afin d'éviter un conflit de nom avec laorg.hamcrest.Matchers
classe et sera probablement supprimé dans mockito v3.0. UtilisezArgumentMatchers
plutôt.Une fonctionnalité quelque peu non documentée: si vous souhaitez développer un Matcher personnalisé qui correspond aux arguments vararg, vous devez l'implémenter
org.mockito.internal.matchers.VarargMatcher
pour qu'il fonctionne correctement. C'est une interface de marqueur vide, sans laquelle Mockito ne comparera pas correctement les arguments lors de l'appel d'une méthode avec varargs en utilisant votre Matcher.Par exemple:
la source
S'appuyant sur la réponse d'Eli Levine, voici une solution plus générique:
Ensuite, vous pouvez l'utiliser avec les matchers de tableau de hamcrest ainsi:
(Évidemment, les importations statiques rendront cela plus lisible.)
la source
J'ai utilisé le code dans la réponse de Peter Westmacott, mais avec Mockito 2.2.15, vous pouvez maintenant faire ce qui suit:
verify(a).method(100L, arg1, arg2, arg3)
où
arg1, arg2, arg3
sont varargs.la source
S'appuyant sur la réponse de topchef,
Pour la version 2.0.31-beta, j'ai dû utiliser Mockito.anyVararg au lieu de Matchers.anyVararrg:
la source
Dans mon cas, la signature de la méthode dont je veux capturer son argument est:
Dans ce cas, vous devez convertir explicitement en tableau d'octets :
J'utilise la version mockito
1.10.19
la source
Vous pouvez également faire une boucle sur les arguments:
par exemple, vérifiez leurs types et lancez-les correctement, ajoutez-les à une liste ou autre.
la source
Adaptation de la réponse de @topchef,
Selon la documentation java pour Mockito 2.23.4, Mockito.any () "Correspond à tout, y compris les valeurs nulles et les varargs."
la source
Vous pouvez accomplir cela en passant une capture ArgumentCaptor, puis en récupérant les varargs sous forme de liste à l'aide de "getAllValues", voir: https://stackoverflow.com/a/55621731/11342928
la source