2016-08-03 20 views
0

MockMvc를 사용하여 통합 테스트 케이스를 작성하여 REST API를 테스트하고 있습니다.mockMVC를 사용하여 통합 테스트를 수행하는 동안 비 스프링 관리 객체를 모의 처리합니다.

내 RESTAPI 구현 내에서 내부적으로 RestTemplate (컨트롤러에서 직접이 아니라 컨트롤러가 호출하는 util 클래스 내에서)를 사용하여 타사 REST API를 호출합니다. 내가 사용하는 RestTemplate (제 3 자 휴식 API를 만들기 위해) 대신 스프링 관리 빈이 아니다. RestTemplate restTemplate = new RestTemplate();

restTemplate 호출 (postForEntity)을 조롱하고 싶습니다.

나는 아래의 방법을 시도하고있다 :

내 테스트 클래스 -

@ContextConfiguration(locations = { 
    "classpath:test-applicationContext.xml" 
}) 
@WebAppConfiguration 

공용 클래스 MockMVCTest 내 응용 문맥에서 {

private MockMvc mockMvc; 
    private RestTemplate restTemplate 

    @Autowired 
    private WebApplicationContext webApplicationContext; 

    @Before 
    public void setUp() { 
    if (!initalized) { 
    mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); 
    restTemplate = (RestTemplate)webApplicationContext.getBean("restTemplate"); 

}

@Test 
public void demo() throws Exception { 
when(
    restTemplate.postForEntity(
    eq("thirdpartyuri"), 
    any(HttpEntity.class), 
    eq(MyClass.class))).thenReturn(myresponse); 

mockMvc.perform(
    post("uriExposedbyme") 
    .contentType(MediaType.APPLICATION_JSON) 
    .accept(MediaType.APPLICATION_JSON) 
    .content(MY_PAYLOAD)).andExpect(status().isOk()); 
} 

나는

<bean id="restTemplate" class="org.mockito.Mockito" factory-method="mock"> 
    <constructor-arg value="org.springframework.web.client.RestTemplate" />  </bean> 

을하지만 내 테스트 케이스를 실행할 때 RestTemplate 조롱지고 있지만 RestTemplate에 대한 호출이 실행 중에 발생하면 실제 resttemplate 대신 내 모의 resttemplate의 호출됩니다 llowing 모의 정의.

내 테스트 케이스에 RestTemplate을 조롱 할 수있는 방법을 제안하십시오.

+0

당신이 당신의 시험 applicationContext.xml –

+0

안녕 Tharsan를 공유 할 수이 내 시험 applicationContext.xml이다 "/> \t \t \t \t <생성자 인수 값 ="org.springframework.web.client.RestTemplate "> \t \t – Ashwini

답변

0

util 클래스는 다음과 같이 private RestTemplate을 인스턴스화합니다. RestTemplate restTemplate = new RestTemplate() ;.

이것은 테스트에서 조롱 된 것이 아니라 사용한다는 것을 의미합니다. RestTemplate을 실제 코드에서 Spring 관리 빈으로 만들거나 util 클래스에서 setter 메소드를 사용하고 조롱 된 나머지 템플릿을 사용하여 테스트에서이 설정기를 호출 할 수있다.

+0

당신이 자세히 설명해 주시겠습니까 /"세터가 메소드를 util 클래스에 추가하고 mocked 나머지 템플리트를 사용하여 테스트에서이 설정 메소드를 호출하십시오 "라고 말하면서 mocked RESTTemplate을 사용하여 util 클래스에서 setter 메소드를 호출하면 어떤 이점이 있습니까? 내 단위 테스트 – Ashwini

0

제공된 정보를 바탕으로 변경 사항을 적용하고 문제가 해결되었는지 확인해 볼 수 있습니다. 당신이 테스트 프로필 오히려, 그것은 가능한 개발의 프로필을 주입 받고 있습니다

@Autowired private WebApplicationContext webApplicationContext; 

로의 WebApplicationContext를 autowire하기 때문에 은 내가 볼 수있는 것은. 당신은 다음과 같이 당신의 RestTemplate 인스턴스와 나머지 템플릿 제대로 문제, 자동차 전선이있는 경우 은 그러므로 당신은

@RunWith(SpringJUnit4ClassRunner.class) 

아직도 테스트 클래스의 상단에 시험 프로파일의 클래스를 표시하기 위해이 주석을 넣을 수 있습니다. 구성 요소 - 스캔 기본 패키지 = "mybasepackage \t <컨텍스트

@Autowired 
@Qualifier("restTemplate") 
private RestTemplate restTemplate;