Czy istnieje czysta metoda wyśmiewania klasy za pomocą ogólnych parametrów? Powiedz, że muszę wyśmiewać klasę, Foo<T>
którą muszę przekazać do metody, która oczekuje Foo<Bar>
. Z łatwością mogę wykonać następujące czynności:
Foo mockFoo = mock(Foo.class);
when(mockFoo.getValue).thenReturn(new Bar());
Zakładając, getValue()
zwraca typ ogólny T
. Ale to będzie miało kocięta, kiedy później przekażę to do metody, która się spodziewa Foo<Bar>
. Czy casting jest jedynym sposobem na zrobienie tego?
Innym sposobem jest użycie
@Mock
adnotacji. Nie działa we wszystkich przypadkach, ale wygląda o wiele bardziej seksownie :)Oto przykład:
MockitoJUnitRunner
Inicjuje pola z adnotacjami@Mock
.źródło
SuppressWarnings
. Ostrzeżenia istnieją z jakiegoś powodu, lepiej nie mieć w zwyczaju ich tłumienia. Dzięki!@Mock
zamiastmock()
: pola są nadal puste w czasie budowy, więc nie mogę wstawić zależności w tym czasie i nie mogę sprawić, by pola były ostateczne. To pierwsze rozwiązanie można@Before
oczywiście rozwiązać za pomocą opatrzonych komentarzem metod.Zawsze możesz utworzyć klasę pośrednią / interfejs, który spełnia typ ogólny, który chcesz określić. Na przykład, jeśli Foo był interfejsem, możesz utworzyć następujący interfejs w swojej klasie testowej.
W sytuacjach, gdzie Foo jest non-final class, można po prostu rozszerzyć klasę z następującego kodu i zrobić to samo:
Następnie możesz wykorzystać jeden z powyższych przykładów z następującym kodem:
źródło
Foo
jest to interfejs lub klasa nieoficjalna, wydaje się, że jest to dość eleganckie rozwiązanie. Dzięki.Utwórz testową metodę narzędzia . Szczególnie przydatne, jeśli potrzebujesz go więcej niż raz.
źródło
static <T> T genericMock(Class<? super T> classToMock) { return (T)mock(classToMock); }
nie potrzebuje nawet jednego tłumienia :) Ale bądź ostrożny,Integer num = genericMock(Number.class)
kompiluje, ale rzucaClassCastException
. Jest to przydatne tylko w najczęstszymG<P> mock = mock(G.class)
przypadku.Zgadzam się, że nie należy tłumić ostrzeżeń w klasach lub metodach, ponieważ można przeoczyć inne, przypadkowo tłumione ostrzeżenia. Ale IMHO jest absolutnie uzasadnione, aby ukryć ostrzeżenie, które dotyczy tylko jednego wiersza kodu.
źródło
Oto ciekawy przypadek: metoda odbiera ogólną kolekcję i zwraca ogólną kolekcję tego samego typu podstawowego. Na przykład:
Metodę tę można wyśmiewać za pomocą kombinacji Mockito anyCollectionOf matcher i Answer.
źródło