Wie man einen Matcher schreibt, der nicht gleich etwas ist

Lesezeit: 2 Minuten

Benutzer-Avatar
Churk

Ich versuche, einen Mock für einen Anruf zu erstellen. Angenommen, ich habe diese Methode, die ich versuche auszudrücken:

class ClassA {
  public String getString(String a) {
    return a + "hey";
  }
}

Was ich zu verspotten versuche, ist: 1. Instanz ist

when(classA.getString(eq("a")).thenReturn(...);`

im selben Testfall

when(classA.getString([anything that is not a])).thenReturn(somethingelse);

Der 2. Fall ist meine Frage: Wie passe ich an anyString() außer “a”?

  • Ich denke, Sie könnten die Antwort als akzeptiert markieren.

    – Troig

    7. Februar 2018 um 15:44 Uhr

Benutzer-Avatar
Troig

Mit Mockito Rahmen, den Sie verwenden können AdditionalMatchers

ClassA classA = Mockito.mock(ClassA.class);
Mockito.when(classA.getString(Matchers.eq("a"))).thenReturn("something"); 
Mockito.when(classA.getString(AdditionalMatchers.not(Matchers.eq("a")))).thenReturn("something else");

Ich hoffe es hilft.

  • AdditionalMatchers scheint inzwischen entfernt worden zu sein.

    – Pieter de Bié

    9. Juli 2018 um 11:12 Uhr

  • Hi @PieterDeBie Ich denke, AdditionalMatchers ist immer noch in der aktuellen Mockito-Version. Sehen Sie es auf dem Github-Projekt

    – Troig

    19. Oktober 2018 um 13:50 Uhr

  • Da Matchers veraltet ist, verwenden Sie stattdessen ArgumentMatchers. Siehe auch hier: zgrepcode.com/mockito/2.24.8/org/mockito/matchers.java

    – Gedanken Nebel

    16. April 2019 um 11:41 Uhr

  • Hier gibt es jedoch einen bemerkenswerten Vorbehalt. Der Rückgabetyp von AdditionalMatchers::not ist 0 für alle numerischen Primitiven, false für die booleschen Primitiven und Null für alle nicht primitiven Objekte T. Dies bedeutet, dass Sie auf hässliche Warnungen stoßen, wenn Sie versuchen, es für verspottete Methoden zu verwenden, bei denen die Parameter mit @Nonnull kommentiert sind.

    – Daniel W.

    26. November 2019 um 13:11 Uhr

Benutzer-Avatar
Johannes B

Verwenden argThat mit Hamcrest:

when(classA.getString(argThat(CoreMatchers.not(CoreMatchers.equalTo("a")))...

Möglicherweise können Sie dies auch über die Bestellung tun. Wenn Sie einen setzen when(anyString) und when(eq("a")) In der richtigen Reihenfolge sollte Mockito sie der Reihe nach testen und gegebenenfalls die „a“-Logik und ansonsten die „anyString“-Logik ausführen.

Bei Mockito ist das letzte Stubbing das Wichtigste. Das bedeutet, dass Sie einfach die Standard-Matcher für Ihre Bedürfnisse verwenden können:

// "Default" return values.
when(classA.getString(ArgumentMatchers.anyString())).thenReturn(somethingelse);
// Specific return value for "a"
when(classA.getString(ArgumentMatchers.eq("a"))).thenReturn(something);

Beachten Sie, dass Sie haben um ArgumentMatchers für beide zu verwenden, da Sie sie mischen.

Ich habe diesen Ansatz tatsächlich gewählt, nachdem ich mir die vorgeschlagenen Antworten sorgfältig angesehen hatte:

doAnswer(new Answer<String>() {
  public String answer(InvocationOnMock invocation) throws Throwable {
    String originalParam = (String) invocation.getArguments()[0];
    return StringUtils.equalsIgnoreCase(originalParam, "a") ? "Something" : "Something Else";
  }
}).when(classA).getString(anyString());

Dadurch kann ich mehr als nur zwei Fälle behandeln, indem ich die Rückgabebasis in den Parametern anpasse.

1057740cookie-checkWie man einen Matcher schreibt, der nicht gleich etwas ist

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy