Matcher Mockito e matrice di primitivi


226

Con Mockito, voglio verify()chiamare un metodo con byte[]nella sua lista di argomenti, ma non ho trovato il modo di scriverlo.

 myMethod( byte[] )

Voglio solo qualcosa del genere anyByteArray(), come farlo con Mockito?


Non ti interessa davvero quali sono i contenuti dell'array di byte? Lo vedo molto nei test unitari, in cui le persone usano i matcher anyX () perché sono convenienti, ma realisticamente dovresti quasi sempre preoccuparti di ciò che viene passato. Se non stai usando una Risposta che consuma effettivamente il valore, probabilmente dovrebbe corrispondere a un argomento atteso reale.
Matunos,

@Matunos: è discutibile. L'uso di any-matcher può semplificare i test e la persona successiva che lo guarda non sarà distratta da una corrispondenza inutilmente precisa e può concentrarsi sullo scopo effettivo del test.
Malik Atalla,

@tbruelle: tieni presente che ogni array in Java è un oggetto. Ciò ti aiuterebbe all'inizio.
Tomasz Przybylski

Risposte:


424

proverei any(byte[].class)


34
Se vuoi verificare un byte specifico [] puoi usareAdditionalMatchers.aryEq(expectedArray)
John Oxley il

5
O Matchers. <Byte []> any ().
jbyler,


12

Preferirei usare Matchers.<byte[]>any(). Questo ha funzionato per me.


1
Avvertimento per tutti: ora è deprecato, quindi sceglierei la risposta votata Mockito.any (byte []. Class)
Chexpir

10

Sono d'accordo con Mutanos e Alecio. Inoltre, si possono verificare quante più chiamate di metodo identiche possibili (verificando le chiamate successive nel codice di produzione, l'ordine delle verifiche non ha importanza). Ecco il codice:

import static org.mockito.AdditionalMatchers.*;

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


0

È possibile utilizzare Mockito.any () anche quando gli argomenti sono matrici. L'ho usato così:

verify(myMock, times(0)).setContents(any(), any());

0

Ciò che funziona per me è stato org.mockito.ArgumentMatchers.isA

per esempio:

isA(long[].class)

funziona benissimo.

la differenza di attuazione reciproca è:

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);
}

-1

Puoi sempre creare un Matcher personalizzato 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;
    }
}));

Scrivere un matcher personalizzato, quando Mockito è in grado di gestire questo caso d'uso sta solo aggiungendo debito tecnico.
linuxdan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.