Mockito Matcher y variedad de primitivas

226

Con Mockito, quiero verify()una llamada al método byte[]en su lista de argumentos, pero no encontré cómo escribir esto.

 myMethod( byte[] )

Solo quiero algo como anyByteArray(), ¿cómo hacer eso con Mockito?

tbruyelle
fuente
¿Realmente no te importa cuáles son los contenidos de la matriz de bytes? Veo esto mucho en las pruebas unitarias, donde las personas usan los comparadores anyX () porque son convenientes, pero de manera realista casi siempre debería importarle lo que se pasa. Si no está usando una respuesta que realmente consuma el valor, probablemente debe coincidir con un argumento esperado real.
Matunos
@Matunos: Eso es discutible. El uso de any-matchers puede hacer que las pruebas sean más simples y la siguiente persona que mira la prueba no se distraerá con una correspondencia innecesariamente precisa y puede centrarse en el propósito real de la prueba.
Malik Atalla
@tbruelle: Tenga en cuenta que cada matriz en Java es un objeto. Eso te ayudaría al principio.
Tomasz Przybylski

Respuestas:

424

lo intentaré any(byte[].class)

gpeche
fuente
34
Si desea verificar un byte específico [] puede usarloAdditionalMatchers.aryEq(expectedArray)
John Oxley
55
O Matchers. <Byte []> any ().
jbyler
31

Prueba esto:

AdditionalMatchers.aryEq(array);
Alécio Carvalho
fuente
12

Prefiero usar Matchers.<byte[]>any(). Esto funcionó para mí.

Fabiano Francesconi
fuente
1
Advertencia para todos: ahora está en desuso, así que iría por la respuesta votada Mockito.any (byte []. Class)
Chexpir
10

Estoy de acuerdo con Mutanos y Alecio. Además, uno puede verificar tantas llamadas a métodos idénticos como sea posible (verificando las llamadas posteriores en el código de producción, el orden de la verificación no importa). Aquí está el código:

import static org.mockito.AdditionalMatchers.*;

    verify(mockObject).myMethod(aryEq(new byte[] { 0 }));
    verify(mockObject).myMethod(aryEq(new byte[] { 1, 2 }));
Rene Ummels
fuente
1

Solía Matchers.refEqpara esto.

Bowofola
fuente
0

Puede usar Mockito.any () cuando los argumentos son matrices también. Lo usé así:

verify(myMock, times(0)).setContents(any(), any());
Crenguta S
fuente
0

Lo que funciona para mí fue org.mockito.ArgumentMatchers.isA

por ejemplo:

isA(long[].class)

Eso funciona bien.

La diferencia de implementación entre ellos es:

public static <T> T any(Class<T> type) {
    reportMatcher(new VarArgAware(type, "<any " + type.getCanonicalName() + ">"));
    return Primitives.defaultValue(type);
}

public static <T> T isA(Class<T> type) {
    reportMatcher(new InstanceOf(type));
    return Primitives.defaultValue(type);
}
Milton Jacomini Neto
fuente
-1

Siempre puedes crear un Matcher personalizado usando argThat

Mockito.verify(yourMockHere).methodCallToBeVerifiedOnYourMockHere(ArgumentMatchers.argThat(new ArgumentMatcher<Object>() {
    @Override
    public boolean matches(Object argument) {
        YourTypeHere[] yourArray = (YourTypeHere[]) argument;
        // Do whatever you like, here is an example:
        if (!yourArray[0].getStringValue().equals("first_arr_val")) {
            return false;
        }
        return true;
    }
}));
Koray Tugay
fuente
Escribir un comparador personalizado, cuando Mockito es capaz de manejar este caso de uso, solo agrega deudas técnicas.
linuxdan