He estado tratando de burlarme de un método con parámetros vararg usando 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));
Esto no funciona, sin embargo, si hago esto en su lugar:
when(a.b(anyInt(), anyInt())).thenReturn(b);
assertEquals(b, a.b(1, 2));
Esto funciona, a pesar de que he omitido por completo el argumento varargs al tropezar con el método.
¿Alguna pista?
java
mocking
variadic-functions
mockito
qualidafial
fuente
fuente
Respuestas:
Mockito 1.8.1 introdujo anyVararg () matcher :
Consulte también el historial de esto: https://code.google.com/archive/p/mockito/issues/62
Edite una nueva sintaxis después de la depreciación:
fuente
anyVararg()
tiene Object como su tipo de retorno. Para que sea compatible con cualquier tipo de var arg (por ejemplo, String ..., Integer ..., etc.), realice una conversión explícita. Por ejemplo, si tienedoSomething(Integer number, String ... args)
puede hacer el código simulado / apéndice con algo comowhen(mock).doSomething(eq(1), (String) anyVarargs())
. Eso debería encargarse del error de compilación.Matchers
ahora está en desuso para evitar un choque de nombres con laorg.hamcrest.Matchers
clase y probablemente se eliminará en mockito v3.0. Usar en suArgumentMatchers
lugar.Una característica algo indocumentada: si desea desarrollar un Matcher personalizado que coincida con los argumentos vararg, debe implementarlo
org.mockito.internal.matchers.VarargMatcher
para que funcione correctamente. Es una interfaz de marcador vacía, sin la cual Mockito no comparará correctamente los argumentos al invocar un método con varargs usando su Matcher.Por ejemplo:
fuente
Aprovechar la respuesta de Eli Levine aquí es una solución más genérica:
Entonces puede usarlo con los emparejadores de matriz de hamcrest así:
(Obviamente, las importaciones estáticas harán que esto sea más legible).
fuente
He estado usando el código en la respuesta de Peter Westmacott, sin embargo, con Mockito 2.2.15 ahora puede hacer lo siguiente:
verify(a).method(100L, arg1, arg2, arg3)
¿Dónde
arg1, arg2, arg3
están los varargs?fuente
Sobre la base de la respuesta de topchef,
Para 2.0.31-beta tuve que usar Mockito.anyVararg en lugar de Matchers.anyVararrg:
fuente
En mi caso, la firma del método que quiero capturar es su argumento:
En este caso, debe convertir explícitamente en la matriz de bytes
Estoy usando la versión mockito
1.10.19
fuente
También puede recorrer los argumentos:
por ejemplo, verifique sus tipos y echéelos adecuadamente, agréguelos a una lista o lo que sea.
fuente
Adaptando la respuesta de @topchef,
Según los documentos de Java para Mockito 2.23.4, Mockito.any () "Coincide con cualquier cosa, incluidos nulos y varargs".
fuente
Puede lograr esto pasando una captura de ArgumentCaptor y luego recuperando los varargs como una lista usando "getAllValues", consulte: https://stackoverflow.com/a/55621731/11342928
fuente