Ist es möglich, den Typ einer Schnittstelle mit Generika zu übergeben?
Die Schnittstelle:
public interface AsyncCallback<T>
In meiner Testmethode:
Mockito.any(AsyncCallback.class)
Putting <ResponseX>
hinter oder .class
funktioniert nicht.
Es gibt einen typsicheren Weg: Verwenden ArgumentMatchers.any()
und qualifizieren Sie ihn mit dem Typ:
ArgumentMatchers.<AsyncCallback<ResponseX>>any()
(Matchers.<AsyncCallback<ResponseX>>any()
Matchers
ist eigentlich veraltet, hat aberArgumentMatchers
funktioniert.Mit Java 8 können Sie
any()
aufgrund der erweiterten Typinferenz einfach (unter der Annahme eines statischen Imports) ohne Argument oder Typparameter verwenden. Der Compiler weiß jetzt aus dem Zieltyp (dem Typ des Methodenarguments), dass Sie tatsächlich meinenMatchers.<AsyncCallback<ResponseX>>any()
, was die Lösung vor Java 8 ist.quelle
any()
passenAsyncCallback<AnyOtherType>
?AsyncCallback<AnyOtherType>
sollte nicht einmal kompiliert werden, wenn der Argumenttyp 'AsyncCallback <ResponseX>' ist.when(x.y(any())).thenAnswer(...)
zum Beispiel, woy
istpublic <T> T y(AsyncCallback<T> arg)
. Vielleicht ist es besser, den Typ in der Antwort zu überprüfen, wenn dies erforderlich ist?isA()
. Wenn das Objekt a enthältClass
Objekt enthält, das dem Typ entspricht, und die Schnittstelle dies verfügbar macht, können Sie es wahrscheinlich in einem benutzerdefinierten Matcher überprüfen. Oder Sie können beispielsweise im Fall von aCollection
den Typ der Elemente überprüfen.Matchers
wurde ersetzt durchArgumentMatchers
in Mockito v2Ich musste den folgenden Mechamismus anwenden, um Generika zuzulassen:
Hoffe das hilft jemandem.
quelle
Pierrefevrier-Kommentar als Antwort posten, was nützlich sein kann, wenn er in einer Antwort anstelle von Kommentaren enthalten ist.
Mit neuen Versionen von Mockito:
(Matchers.<AsyncCallback<ResponseX>>any()
quelle
Nach der Antwort von thSoft bedeutete das Setzen des qualifizierten Aufrufs einer beliebigen Methode () in der Methode, dass ich die Qualifikation entfernen konnte, da der Rückgabetyp Rückschlüsse zuließ:
quelle
Sie können es einfach umsetzen und Unterdrückungswarnungen hinzufügen, wenn Sie möchten:
Wenn Java 'generische' Generika zulässt, könnten sie eine Methode wie diese haben, nach der Sie suchen
quelle
You cannot use argument matchers outside of verification or stubbing.
@SuppressWarnings
: Pre-Java 8, wenn Sie es einer separaten Variablen zuweisenany()
möchten , können Sie es wie in der Antwort von INToy verwenden. Jetzt mit Java 8,any()
kann inline verwendet werden, ohne dass eine separate Zuordnung erforderlich ist.Ich hatte ein ähnliches Problem mit Spring
Example
:Hier müssen Sie die Qualifikation verwenden. Die Methode b / c findAll kann mehrere Typen annehmen, z. B.
Sort
undIterable
. Sie könnenMockito.any(Example.class)
natürlich auch die Typensicherheitswarnung verwenden.quelle