Gibt es eine saubere Methode, eine Klasse mit generischen Parametern zu verspotten? Angenommen, ich muss eine Klasse verspotten, Foo<T>
die ich an eine Methode übergeben muss, die a erwartet Foo<Bar>
. Ich kann Folgendes leicht genug tun:
Foo mockFoo = mock(Foo.class);
when(mockFoo.getValue).thenReturn(new Bar());
Angenommen, es wird getValue()
der generische Typ zurückgegeben T
. Aber das wird Kätzchen haben, wenn ich es später in eine erwartete Methode übergebe Foo<Bar>
. Ist Casting das einzige Mittel, um dies zu tun?
Eine andere Möglichkeit, dies zu
@Mock
umgehen, besteht darin, stattdessen Anmerkungen zu verwenden. Funktioniert nicht in allen Fällen, sieht aber viel sexy aus :)Hier ist ein Beispiel:
Das
MockitoJUnitRunner
initialisiert die mit Anmerkungen versehenen Felder@Mock
.quelle
SuppressWarnings
. Warnungen gibt es aus einem Grund, es ist besser, nicht die Gewohnheit zu haben, sie zu unterdrücken. Vielen Dank!@Mock
anstelle von verwendemock()
: Die Felder sind während der Erstellungszeit immer noch null, daher kann ich zu diesem Zeitpunkt keine Abhängigkeiten einfügen und die Felder nicht endgültig machen. Ersteres kann@Before
natürlich durch eine kommentierte Methode gelöst werden .Sie können jederzeit eine Zwischenklasse / Schnittstelle erstellen, die dem generischen Typ entspricht, den Sie angeben möchten. Wenn Foo beispielsweise eine Schnittstelle wäre, könnten Sie die folgende Schnittstelle in Ihrer Testklasse erstellen.
In Situationen, in denen Foo eine nicht endgültige Klasse ist, können Sie die Klasse einfach mit dem folgenden Code erweitern und dasselbe tun:
Dann könnten Sie eines der obigen Beispiele mit dem folgenden Code verwenden:
quelle
Foo
handelt sich um eine Schnittstelle oder eine nicht endgültige Klasse, scheint dies eine einigermaßen elegante Lösung zu sein. Vielen Dank.Erstellen Sie eine Testdienstprogrammmethode . Besonders nützlich, wenn Sie es mehrmals benötigen.
quelle
static <T> T genericMock(Class<? super T> classToMock) { return (T)mock(classToMock); }
es braucht nicht einmal eine einzige Unterdrückung :) Aber sei vorsichtig,Integer num = genericMock(Number.class)
kompiliere, sondern wirftClassCastException
. Dies ist nur für den häufigstenG<P> mock = mock(G.class)
Fall nützlich .Ich bin damit einverstanden, dass man Warnungen in Klassen oder Methoden nicht unterdrücken sollte, da man andere, versehentlich unterdrückte Warnungen übersehen könnte. Aber meiner Meinung nach ist es absolut vernünftig, eine Warnung zu unterdrücken, die nur eine einzige Codezeile betrifft.
quelle
Hier ist ein interessanter Fall: Die Methode empfängt eine generische Sammlung und gibt eine generische Sammlung desselben Basistyps zurück. Beispielsweise:
Diese Methode kann mit einer Kombination aus Mockito anyCollectionOf Matcher und der Antwort verspottet werden.
quelle