Mockito Matcher und eine Reihe von Grundelementen

226

Mit Mockito möchte ich verify()einen Methodenaufruf mit byte[]in seiner Argumentliste, aber ich habe nicht gefunden, wie ich das schreiben soll.

 myMethod( byte[] )

Ich möchte nur so etwas wie anyByteArray(), wie macht man das mit Mockito?

tbruyelle
quelle
Interessiert es Sie wirklich nicht, was der Inhalt des Byte-Arrays ist? Ich sehe dies häufig bei Unit-Tests, bei denen Benutzer anyX () - Matcher verwenden, weil sie praktisch sind, aber realistisch gesehen sollten Sie sich fast immer darum kümmern, was übergeben wird. Wenn Sie keine Antwort verwenden, die den Wert tatsächlich verbraucht, sind Sie wahrscheinlich sollte mit einem tatsächlich erwarteten Argument übereinstimmen.
Matunos
@ Matunos: Das ist umstritten. Die Verwendung der Any-Matcher kann die Tests vereinfachen, und die nächste Person, die den Test betrachtet, wird nicht durch unnötig genaue Übereinstimmungen abgelenkt und kann sich auf den eigentlichen Zweck des Tests konzentrieren.
Malik Atalla
@tbruelle: Bitte beachten Sie, dass jedes Array in Java ein Objekt ist. Das würde dir am Anfang helfen.
Tomasz Przybylski

Antworten:

424

ich würde versuchen any(byte[].class)

gpeche
quelle
34
Wenn Sie ein bestimmtes Byte [] überprüfen möchten, können Sie verwendenAdditionalMatchers.aryEq(expectedArray)
John Oxley
5
Oder Matcher. <Byte []> any ().
Jbyler
31

Versuche dies:

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

Ich würde lieber verwenden Matchers.<byte[]>any(). Das hat bei mir funktioniert.

Fabiano Francesconi
quelle
1
Warnung für alle: Jetzt ist veraltet, also würde ich für die abgestimmte Antwort Mockito.any (Byte []. Klasse)
Chexpir
10

Ich stimme Mutanos und Alecio zu. Außerdem kann man so viele identische Methodenaufrufe wie möglich überprüfen (Überprüfung der nachfolgenden Aufrufe im Produktionscode, die Reihenfolge der Überprüfungen spielt keine Rolle). Hier ist der Code:

import static org.mockito.AdditionalMatchers.*;

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

Ich habe dafür verwendet Matchers.refEq.

Bowofola
quelle
0

Sie können Mockito.any () verwenden, wenn Argumente auch Arrays sind. Ich habe es so benutzt:

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

Was für mich funktioniert war org.mockito.ArgumentMatchers.isA

beispielsweise:

isA(long[].class)

das funktioniert gut.

Der Implementierungsunterschied voneinander ist:

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
quelle
-1

Sie können jederzeit einen benutzerdefinierten Matcher mit erstellen 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
quelle
Das Schreiben eines benutzerdefinierten Matchers, wenn Mockito in der Lage ist, diesen Anwendungsfall zu behandeln, führt nur zu zusätzlichen technischen Schulden.
Linuxdan