Mockito matcher i tablica prymitywów

226

W przypadku Mockito chcę verify()wywołać metodę z byte[]listy argumentów, ale nie znalazłem sposobu na napisanie tego.

 myMethod( byte[] )

Chcę tylko coś takiego anyByteArray(), jak to zrobić z Mockito?

tbruyelle
źródło
Czy naprawdę nie obchodzi Cię, jaka jest zawartość tablicy bajtów? Widzę to bardzo często w testach jednostkowych, gdzie ludzie używają dopasowań anyX (), ponieważ są one wygodne, ale realistycznie prawie zawsze powinieneś dbać o to, co jest przekazywane. Jeśli nie używasz odpowiedzi, która faktycznie zużywa wartość, prawdopodobnie powinien pasować do rzeczywistego oczekiwanego argumentu.
Matunos,
@Matunos: To dyskusyjne. Korzystanie z dowolnych dopasowań może uprościć testy, a kolejna osoba, która spojrzy na test, nie będzie rozpraszana niepotrzebnie precyzyjnym dopasowaniem i może skupić się na rzeczywistym celu testu.
Malik Atalla,
@tbruelle: Należy pamiętać, że każda tablica w Javie jest obiektem. To pomoże ci na początku.
Tomasz Przybylski

Odpowiedzi:

424

spróbowałbym any(byte[].class)

gpeche
źródło
34
Jeśli chcesz zweryfikować konkretny bajt [], możesz użyćAdditionalMatchers.aryEq(expectedArray)
John Oxley
5
Lub Matchers. <Byte []> any ().
jbyler
31

Spróbuj tego:

AdditionalMatchers.aryEq(array);
Alécio Carvalho
źródło
12

Wolałbym użyć Matchers.<byte[]>any(). To zadziałało dla mnie.

Fabiano Francesconi
źródło
1
Ostrzeżenie dla wszystkich: Teraz jest przestarzałe, więc wybrałbym głosowaną odpowiedź Mockito.any (byte []. Class)
Chexpir
10

Zgadzam się z Mutanos i Alecio. Ponadto można sprawdzić jak najwięcej identycznych wywołań metod (weryfikacja kolejnych wywołań w kodzie produkcyjnym, kolejność weryfikacji nie ma znaczenia). Oto kod:

import static org.mockito.AdditionalMatchers.*;

    verify(mockObject).myMethod(aryEq(new byte[] { 0 }));
    verify(mockObject).myMethod(aryEq(new byte[] { 1, 2 }));
Rene Ummels
źródło
1

Użyłem Matchers.refEqdo tego.

Bowofola
źródło
0

Możesz użyć Mockito.any (), gdy argumenty są również tablicami. Użyłem tego w ten sposób:

verify(myMock, times(0)).setContents(any(), any());
Crenguta S
źródło
0

To, co dla mnie działa, było org.mockito.ArgumentMatchers.isA

na przykład:

isA(long[].class)

to działa dobrze.

różnica między sobą wynosi:

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
źródło
-1

Zawsze możesz utworzyć niestandardowy Matcher za pomocą 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
źródło
Pisanie niestandardowego elementu dopasowującego, gdy Mockito jest w stanie poradzić sobie z tym przypadkiem użycia, dodaje tylko dług techniczny.
linuxdan