2016-05-13 5 views
0

Ich verwende Mockito für Unit-Tests. Und es gibt viele Matcher wie anyString(), anyBoolean() in Mockito. Aber nehmen wir an, wenn ich eine benutzerdefinierte haben enum wieWie erstellt man benutzerdefinierte Matcher in Mockito?

Enum LoginType.java

//LoginType.java 
public enum LoginType { 
    FACEBOOK, 
    EMAIL, 
    GOOGLE 
} 

In einem der Methodenargumente Ich brauche eine Instanz von LoginType passieren. Wie übergebe ich das Argument, ohne explizit LoginType.FACEBOOK oder LoginType.GOOGLE zu übergeben. So etwas wie anyString(). Jeder Hinweis in diese Richtung wird nützlich sein.

Antwort

1

Für any Verhalten, einfach aufrufen Matchers.any() kann gut genug sein auf Java 8. Das ist, wenn Parameter Typ Inferenz herauskam.

Sie könnten auch wählen Matchers.any(LoginType.class), die reine any() Verhalten in Mockito 1.x hat, wird aber Typ prüfen in Mockito 2.0 und darüber hinaus. In beiden Fällen hilft Java, wenn Sie das Klassenliteral übergeben, die Typinformationen, die Sie für die Schlussfolgerung benötigen.


Für die damit verbundenen Probleme:

  • Wenn Sie einen generischen Typ, die Klasse wörtliche isn `t genug entweder; Sie müssen es als ein explizite Methode Parameter angeben:

    Matchers.<YourContainer<YourType>>any(); 
    

    ... oder zu einer statischen Hilfsmethode extrahieren, die Sie anstelle einem konstanten oder lokalen Variable tun müssen, weil Mockito matchers work via side effects:

    public static LoginType anyLoginType() { 
        return Matchers.any(); 
    } 
    
  • Schließlich, für zukünftige Leser, die hier sein könnten, um benutzerdefinierte Anpassungslogik zu implementieren, suchen Sie nach Matchers.argThat oder MockitoHamcrest.argThat, um ein Hamcrest-artiges Matcher-Objekt an einen Mockito-Methodenaufruf anzupassen.