pulla
pulla
#programowanie #java
Cze,
Mam pewien problem z mockowaniem serwisu w moim teście (dopiero zaczynam zabawę z mockito). Sytuacja wygląda tak, mam serwis który w sobie ma kilka innych serwisów (wstrzykuje za pomocą @autowired). Klasa testowa ma takie anotacje:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration

Mam coś takiego w beforze:

@Before
public void init() {
mocktockDetailsWebParser = Mockito.mock(StockDetailsWebParser.class);
when(mocktockDetailsWebParser.getStockNameFromWeb(anyObject())).thenReturn("AAA AAA");
ReflectionTestUtils.setField(stockTickerUpdater, "detailsParser", mocktockDetailsWebParser);

I niestety to nie działa, pomimo wywołania metody getStockNameFromWeb, wywołana jest metoda serwisu a nie mojego mockowanego obiektu. Da się jakoś wymieszać spring injection z mockowaniem? Bo chciałbym, aby pozostałe serwisy korzystały z własnych implementacji a tylko dla tego jednego użyć mockowania.
2
  • Najlepsze
  • Wszystkie komentarze
BigAngryPenguin
@pulla: Klasa z testami powinna mieć adnotacje @RunWith(MockitoJUnitRunner.class)
Co do wstrzykiwania mocków to nie wiem jak to w springu (korzystam tylko z jee) ale ja robię tak: obiekt mockowany ma adnotację @Mock a klasa która ma z tego mocka korzystać @InjectMocks
0
pulla
pulla
@BigAngryPenguin: Tak to wiem, ale wtedy musze zrobic mocki na wszystkich serwisach, bo inaczej leci nullpointer. A chciałbym tylko na jednym.
0
pulla
pulla
@BigAngryPenguin: Dobra już mam. Nie było tematu :) Po prostu tworze sobie obiekt mojego serwisu nie używajac spring injection. Ale do samego tekstu wstrzykuje sobie serwisy ktore sa potrzebne dla mojego glownego serwisu i je ustawiam przez ReflectionTestUtils wiec wtedy maja domyslna implementacje. A te które potrzebuje zamockowac mockuje i tak samo ustawiam przez ReflectionTestUtils.
0
nachteil
@pulla: Tak tylko dodam od siebie, że jeśli musisz przy testowaniu korzystać z refleksji, to najprawdopodobniej to Twoje dependency injection jest źle zaprojektowane
0
pulla
pulla
@nachteil: Tak wiem, powinienem pewnie wstrzykiwac przez konstruktor, a teraz mam tylko wstrzykiwanie przez pole.
0
franciss
franciss
@pulla
jeśli dobrze rozumiem co chcesz uzyskać, to stwórz inner-class z anotacją @Configuration, która tworzy twoje mockowe beany używając @Bean. Powinny one być bezpośrednio wstrzyknięte do testowanego serwisu i do samego testu, żebyś mógł je w @Before odpowiednio skonfigurować.
0