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?


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)


34
Wenn Sie ein bestimmtes Byte [] überprüfen möchten, können Sie verwendenAdditionalMatchers.aryEq(expectedArray)
John Oxley

5
Oder Matcher. <Byte []> any ().
Jbyler


12

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


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


0

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

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

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

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

Das Schreiben eines benutzerdefinierten Matchers, wenn Mockito in der Lage ist, diesen Anwendungsfall zu behandeln, führt nur zu zusätzlichen technischen Schulden.
Linuxdan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.