2016-06-13 3 views
4

도우미 클래스의 메서드를 테스트하는 JUnit 테스트 케이스를 작성하려고합니다. 이 메소드는 REST를 사용하여 외부 애플리케이션을 호출하며,이 호출은 JUnit 테스트에서 조롱하려고 시도한다.MockRestServiceServer를 사용하여 REST 호출 조롱

도우미 메서드는 Spring의 RestTemplate을 사용하여 REST 호출을 만듭니다. 내 테스트에서

, 나는 모의 REST 서버 및 모의 REST 템플릿을 생성하고이처럼 그들을 instanitiate : 헬퍼 방법이 있습니다 때 적절한 응답을 반환해야합니다 있도록

@Before 
public void setUp() throws Exception { 
    mockServer = MockRestServiceServer.createServer(helperClass.getRestTemplate()); 
} 

내가 다음 모의 서버 씨앗 나머지 전화 : 내 테스트를 실행하면

// response is some XML in a String 
mockServer 
    .expect(MockRestRequestMatchers.requestTo(new URI(myURL))) 
    .andExpect(MockRestRequestMatchers.method(HttpMethod.GET)) 
    .andRespond(MockRestResponseCreators.withStatus(HttpStatus.OK) 
     .contentType(MediaType.APPLICATION_XML) 
     .body(response)); 

는, 헬퍼 방법은 REST에서 널 응답을 수신은 만들고 테스트가 실패 호출합니다.

도우미가 만드는 REST URL에 쿼리 매개 변수가 있으며 "http://server:port/application/resource?queryparam1=value1&queryparam2=value2"과 같습니다.

나는 (이 응답을 반환하도록 일치를 이끌어내는)은 "myURL이"변수 모두 쿼리 매개 변수없이 와 URL ("http://server:port/application/resource")을 퍼팅 시도했지만 모의를 얻을 수 없다 서버가 아무것도 반환하지 않습니다.

나는이 종류의 코드 예제를 검색해 보았지만 내 시나리오와 비슷한 것으로 보이는 것을 아직 찾지 못했습니다.

봄 버전 4.1.7.

미리 도움을 청하십시오.

+0

목차 정적 메소드에 클래스를 작성하기위한 클래스. 'requestTo '. – sjngm

답변

6

MockRestServiceServer의 인스턴스를 만들 때 프로덕션 코드에서 사용중인 RestTemplate의 기존 인스턴스를 사용해야합니다. 따라서 RestTemplate을 테스트에 삽입하고 MockRestServiceServer.createServer을 호출 할 때 사용하십시오 - 테스트에서 새로운 RestTemplate을 생성하지 마십시오.

+0

문제는 제 실수였습니다. 내가 당신의 제안에 따라 제대로 인스턴스화 된보다는 오히려 테스트를 위해 조롱 된 RestTemplate 객체를 사용하고있었습니다. 이 작업이 대체되면 테스트가 성공적으로 완료되었습니다. – GarlicBread

+0

RestTemplate도 테스트하는 데 문제가 있습니다. 그러나, 제 경우에는 RestTemplate 인스턴스에 액세스 할 수 없습니다. 내 도우미 클래스의 코드는'new RestTemplate(). exchange (uri, HttpMethod.GET, ...) '와 같습니다. 어떻게 테스트 할 수 있습니까? –

4

나머지 클라이언트를 테스트하려는 것으로 보입니다. 나머지 서버는 다른 곳에서 테스트해야합니다. RestTemplate -> 서비스를 호출하는 중입니다. 그런 다음 RestTemplate과 통화 결과를 조롱했습니다.

@Mock 
RestTemplate restTemplateMock; 

및 서비스에서 테스트 클래스

@InjectMocks 
Service service; 

하자 말은, 서비스의 FilterData 방법을 테스트하기 위해, 그리고

public void filterData() { 
    MyResponseModel response = restTemplate.getForObject(serviceURL, MyResponseModel.class); 
    // further processing with response 
} 

으로 시험 할 수있는 방법을 가지고, 당신은 응답을 조롱 할 필요가 rest from 예 :

mockResponseModel = createMockResponse(); 
Mockito.when(restTemplateMock.getForObject(serviceURL, MyResponseModel.class)).thenReturn(mockResponseModel); 

service.filterData(); 
//Other assert/verify,... go here 
관련 문제