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?


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)


34
Si vous voulez vérifier un octet spécifique [], vous pouvez utiliserAdditionalMatchers.aryEq(expectedArray)
John Oxley

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


12

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


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


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

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

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

Écrire un matcher personnalisé, lorsque Mockito est capable de gérer ce cas d'utilisation, ne fait qu'ajouter de la dette technique.
linuxdan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.