czy możliwe jest przekazanie typu interfejsu za pomocą typów generycznych?
Interfejs:
public interface AsyncCallback<T>
W mojej metodzie testowej:
Mockito.any(AsyncCallback.class)
Odkładanie <ResponseX>
za lub za .class
wykonaną pracę.
Istnieje sposób bezpieczny dla typu: użyj ArgumentMatchers.any()
i zakwalifikuj go za pomocą typu:
ArgumentMatchers.<AsyncCallback<ResponseX>>any()
(Matchers.<AsyncCallback<ResponseX>>any()
Matchers
jest faktycznie przestarzały, aleArgumentMatchers
zadziałał.Korzystając z języka Java 8, możesz po prostu użyć
any()
(zakładając import statyczny) bez argumentu lub parametru typu ze względu na ulepszone wnioskowanie o typie. Kompilator wie teraz na podstawie typu docelowego (typ argumentu metody), który faktycznie masz na myśliMatchers.<AsyncCallback<ResponseX>>any()
, czyli rozwiązanie sprzed wersji Java 8.źródło
any()
pasowałbyAsyncCallback<AnyOtherType>
również?AsyncCallback<AnyOtherType>
nie powinno się nawet kompilować, jeśli typ argumentu to „AsyncCallback <ResponseX>”.when(x.y(any())).thenAnswer(...)
na przykład, gdziey
jestpublic <T> T y(AsyncCallback<T> arg)
. Może lepiej byłoby sprawdzić typ odpowiedzi, jeśli to jest potrzebne?isA()
. Jeśli obiekt zawieraClass
obiekt odpowiadający typowi, a interfejs to ujawnia, myślę, że możesz to sprawdzić w niestandardowym dopasowywaniu. Lub na przykład w przypadkuCollection
możesz sprawdzić rodzaj elementów.Matchers
został zastąpionyArgumentMatchers
w Mockito v2Musiałem przyjąć następujący mechanizm, aby umożliwić stosowanie leków generycznych:
Mam nadzieję, że to komuś pomoże.
źródło
Zamieszczanie bardziej szczegółowego komentarza jako odpowiedzi, który może być przydatny, jeśli jest obecny w odpowiedzi zamiast w komentarzach.
Z nowymi wersjami Mockito:
(Matchers.<AsyncCallback<ResponseX>>any()
źródło
W związku z odpowiedzią thSoft umieszczenie wywołania kwalifikowanego do metody any () w metodzie oznaczało, że mogłem usunąć kwalifikację, ponieważ typ zwracany umożliwia wnioskowanie:
źródło
Możesz go po prostu przesłać, dodając pomijane ostrzeżenia, jeśli chcesz:
Gdyby Java zezwoliła na „generyczne” typy generyczne, mogłaby mieć metodę taką, jak ta, której szukasz
źródło
You cannot use argument matchers outside of verification or stubbing.
@SuppressWarnings
: pre-java 8, jeśli zamierzasz przypisać go do oddzielnej zmiennej, możesz po prostu użyć odpowiedziany()
tak, jak w odpowiedzi INtoy. Teraz z java 8any()
może być używany inline bez potrzeby oddzielnego przypisania.Miałem podobny problem podczas używania Springa
Example
:Tutaj musisz użyć kwalifikacji, b / c metoda findAll może przyjmować wiele typów, takich jak
Sort
iIterable
. Możesz równieżMockito.any(Example.class)
oczywiście użyć z ostrzeżeniem bezpieczeństwa typu.źródło