2016-07-04 5 views
6

저는 몇 가지 방법으로 봄에 작성하는 서비스 클래스를 가졌습니다.restFul 클라이언트로 서비스를 테스트하기위한 resttemplate을 모방합니다.

..... 
     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(); 
     } 

내가 내 서비스를 조롱 Mockito를 사용하기를 원하지만 restuful 서버 인스턴스 새로운 RestTemplate과 상호 작용하는 모든 방법 :이 중 하나는 resful 소비자 아래와 같은 역할을합니다. 내 서비스에 주입하기 위해 정적 클래스를 생성해야합니까?

+0

어떤 조롱 프레임 워크를 사용합니까? 또한 의존성 삽입을 사용하여 새로운 템플릿을 만드는 대신 RestTemplate을 삽입 할 수 있다면 ** 많이 ** 쉬울 것입니다. – g00glen00b

답변

6

종속성 삽입의 이점 중 하나는 쉽게 종속성을 조롱 할 수 있다는 것입니다. Mockito 당신 '과 단위 테스트를 위해

@Autowired 
private RestTemplate restTemplate; 

:

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

그리고 클라이언트에 new RestTemplate()을 사용하는 대신에

은 사용한다 : 귀하의 경우에 RestTemplate 빈을 만들 훨씬 쉽게 될 것이다

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

을이 경우 Mockito 조롱하고있는 RestTemplate 빈을 주입 : 사용하여 예를 들어, RestTemplate을 조롱 할 것이다 귀하의 Client. 조롱과 반사를 통해 주입하는 것을 좋아하지 않는다면 항상 별도의 생성자 또는 설정자가 RestTemplate 모의 주입을 할 수 있습니다.

지금 당신은이 같은 시험을 쓸 수 있습니다 :

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

당신은 아마 그것보다 테스트 할 수 있습니다,하지만 그것은 당신에게 기본 아이디어를 제공합니다.

+0

예,이 방법이 있습니다! 정말 고맙습니다 –

0

인스턴스가 new 키워드로 생성되었으므로 Mockito를 사용하여 restTemplate을 모의 할 수 없습니다.

mock(RestTemplate.class) 

및 서비스 클래스에 전달 :

대신 당신은 테스트 클래스에 모의 객체를 만들려고합니다.

희망이 있습니다.

+0

restTemplate을 인스턴스화하고 주입하는 정적 calss를 사용해야합니까? –

+0

나는'restTemplate'을 저장하기위한 필드를 추가하고 모의 객체를 삽입하기 위해 패키지를 볼 수있는 생성자를 생성하고 싶습니다. – mrtowel

관련 문제