Matcher Mockito et tableau de primitives

226

Avec Mockito, je veux verify()un appel de méthode avec byte[]dans sa liste d'arguments, mais je n'ai pas trouvé comment écrire ceci.

 myMethod( byte[] )

Je veux juste quelque chose comme anyByteArray(), comment faire ça avec Mockito?

tbruyelle
la source
Ne vous souciez-vous vraiment pas du contenu du tableau d'octets? Je vois cela souvent dans les tests unitaires, où les gens utilisent des égaliseurs anyX () parce qu'ils sont pratiques, mais en réalité, vous devriez presque toujours vous soucier de ce qui est passé. Si vous n'utilisez pas une réponse qui consomme réellement la valeur, vous avez probablement doit correspondre à un argument réel attendu.
Matunos
@Matunos: C'est discutable. L'utilisation de n'importe quel apparieur peut simplifier les tests et la prochaine personne qui regarde le test ne sera pas distraite par une correspondance inutilement précise et peut se concentrer sur le but réel du test.
Malik Atalla
@tbruelle: N'oubliez pas que chaque tableau en Java est un objet. Cela vous aiderait au début.
Tomasz Przybylski

Réponses:

424

Je voudrais essayer any(byte[].class)

gpeche
la source
34
Si vous voulez vérifier un octet spécifique [], vous pouvez utiliserAdditionalMatchers.aryEq(expectedArray)
John Oxley
5
Ou Matchers. <Byte []> any ().
jbyler
31

Essaye ça:

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

Je préfère utiliser Matchers.<byte[]>any(). Cela a fonctionné pour moi.

Fabiano Francesconi
la source
1
Avertissement pour tout le monde: maintenant est obsolète, alors j'irais pour la réponse votée Mockito.any (byte []. Class)
Chexpir
10

Je suis d'accord avec Mutanos et Alecio. De plus, on peut vérifier autant d'appels de méthode identiques que possible (en vérifiant les appels suivants dans le code de production, l'ordre des vérifications n'a pas d'importance). Voici le code:

import static org.mockito.AdditionalMatchers.*;

    verify(mockObject).myMethod(aryEq(new byte[] { 0 }));
    verify(mockObject).myMethod(aryEq(new byte[] { 1, 2 }));
René Ummels
la source
1

J'ai utilisé Matchers.refEqpour ça.

Bowofola
la source
0

Vous pouvez également utiliser Mockito.any () lorsque les arguments sont également des tableaux. Je l'ai utilisé comme ceci:

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

Ce qui a fonctionné pour moi était org.mockito.ArgumentMatchers.isA

par exemple:

isA(long[].class)

ça marche bien.

la différence de mise en œuvre les uns des autres est:

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
la source
-1

Vous pouvez toujours créer un Matcher personnalisé en utilisant 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
la source
Écrire un matcher personnalisé, lorsque Mockito est capable de gérer ce cas d'utilisation, ne fait qu'ajouter de la dette technique.
linuxdan