2016-07-04 10 views
6

Mam klasę usług, napisz na wiosnę, z pewnymi metodami. Jednym z tego działa jako resful konsument jak poniżej:mock resttemplate, aby przetestować usługę jako restFul klienta

..... 
     HttpEntity request = new HttpEntity<>(getHeadersForRequest()); 
     RestTemplate restTemplate = new RestTemplate(); 
     String url = ENDPOINT_URL.concat(ENDPOINT_API1); 

     UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url) 
       .queryParam("param1", parameter1); 
     ReportModel infoModel = null; 
     try{ 
      infoModel = restTemplate.exchange(builder.toUriString(), HttpMethod.GET, request, ReportModel.class).getBody(); 
     }catch (HttpClientErrorException | HttpServerErrorException e){ 
      e.printStackTrace(); 
     } 

chcę użyć Mockito wyśmiewać moją usługę, ale każda metoda, które oddziałują z restuful instancji serwera nowy RestTemplate. Czy muszę utworzyć klasę statyczną, aby wprowadzić ją do mojej usługi?

+0

Których szyderczych ram używasz? Ponadto byłoby to o wiele łatwiejsze, gdybyś mógł użyć zastrzyku zależności, aby wstrzyknąć 'RestTemplate' zamiast tworzyć nowy. – g00glen00b

Odpowiedz

6

Jedną z korzyści wynikających z wstrzyknięcia zależności jest możliwość łatwego kpienia z twoich zależności. W twoim przypadku to byłoby o wiele łatwiejsze, aby stworzyć RestTemplate Fasola:

@Bean 
public RestTemplate restTemplate() { 
    return new RestTemplate(); 
} 

I zamiast korzystania new RestTemplate() w kliencie należy użyć:

@Autowired 
private RestTemplate restTemplate; 

Do testów jednostkowych z Mockito you” ll muszą mock RestTemplate, na przykład za pomocą:

@RunWith(MockitoJUnitRunner.class) 
public class ClientTest { 
    @InjectMocks 
    private Client client; 
    @Mock 
    private RestTemplate restTemplate; 
} 

w tym przypadku będzie Mockito mock i wstrzyknąć RestTemplate fasoli w twój Client. Jeśli nie lubisz szyderstwa i wstrzykiwania przez odbicie, zawsze możesz wybrać oddzielnego konstruktora lub setera, który wstrzyknie próbkę RestTemplate.

Teraz można napisać test takiego:

client.doStuff(); 
verify(restTemplate).exchange(anyString(), eq(HttpMethod.GET), any(HttpModel.class), eq(ReportModel.class)); 

Najprawdopodobniej będziesz chcesz przetestować więcej, ale to daje podstawową ideę.

+0

Tak, to jest sposób! Dziękuję bardzo –

0

Nie będzie można ośmieszać się z restTemplate przy użyciu Mockito, ponieważ instancja jest tworzona za pomocą słowa kluczowego new.

Zamiast tego należy starać się stworzyć atrapa obiektu w klasie testu:

mock(RestTemplate.class) 

i przekazać je do klasy usług.

Mam nadzieję, że to pomaga.

+0

Muszę użyć statycznych calss, które tworzą instancję restTemplate i wstrzykiwać? –

+0

Wolę dodać pole do przechowywania 'restTemplate' i utworzyć konstruktor widoczny w pakiecie, aby wstrzyknąć próbę. – mrtowel

Powiązane problemy