2012-10-19 10 views
0

컨트롤러에 대한 테스트를 만들려고합니다. 다음은 내가 비슷한 점입니다. 그냥 이름 변경. 나는 Mockito와 Spring MVC를 사용하고있다. 테스트 구성 파일에는 모의 팩토리를 통해 모의 처리 된 자동 작성 빈이 있습니다. 나는이 문제를 해결하기 위해 내가 뭘하고 있니?

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={ 
     ... 
}) 
public class MyReportControllerTest { 

private MockHttpServletRequest request; 
private MockHttpServletResponse response; 
private MockHttpSession session; 
private HandlerAdapter handlerAdapter; 

@Autowired 
private ApplicationContext applicationContext; 

@Autowired 
private MyService myService; 

@Autowired 
private RequestMappingHandlerMapping rmhm; 

@Before 
public void setUp() throws Exception { 
    request = new MockHttpServletRequest(); 
    response = new MockHttpServletResponse(); 
    session = new MockHttpSession(); 
    handlerAdapter = applicationContext 
      .getBean(RequestMappingHandlerAdapter.class); 

    request.setSession(session); 
    request.addHeader("authToken", "aa"); 

    Mockito.when(
      myService.getMyInfo(YEAR)) 
      .thenReturn(getMyInfoList()); 
} 
@Test 
public void testGetMyInfo(){ 
    request.setRequestURI("/getMyInfo/" + 2011); 
    request.setMethod("GET"); 

    try { 
     if(handlerAdapter == null){ 
      System.out.println("Handler Adapter is null!"); 
     } 
     if(request == null){ 
      System.out.println("Request is null!"); 
     } 
     if(response == null){ 
      System.out.println("Response is null!"); 
     } 
     if(rmhm.getHandler(request) == null){ 
      System.out.println("rmhm.getHandler(request) is null!"); 
     } 
     //the above returns null 
     System.out.println("RMHM: " + rmhm.toString()); 
     System.out.println("RMHM Default Handler: " + rmhm.getDefaultHandler()); 
     handlerAdapter.handle(request, response, 
       rmhm.getHandler(request) 
       .getHandler());//null pointer exception here <--- 

     ... 


    } catch (Exception e) { 
     e.printStackTrace(); 
     fail("getMyReport failed. Exception"); 
    } 

} 

public List<MyInfo> getMyInfoList(){...} 

나는 철저한 디버깅을 수행하고 핸들러 내 모의 요청에 대해 널 (null) 남아있는 것을 발견했다 ... 널 포인터를 얻는다. 내가 처리기로 바뀌지 않거나 기본 처리기로 간다는 것을 무엇이 놓치고 있습니까?

답변

0

여기에 몇 가지 문제가 있습니다.

첫째, 당신은 단위 테스트 당신의 컨트롤러 또는 통합 테스트 그것을 시도? 확실히 통합 테스트와 비슷합니다. Spring @Autowired 특수 효과와 @ContextConfiguration이 있습니다.

그렇다면 모의 행위를 myService에 정의하려고하는 이유는 무엇입니까? 그것은 결코 작동하지 않을 것입니다. 스프링은 "진짜"인스턴스를 주입 할 것이고 Mockito는 그것에 마법을 쓸 희망이 없습니다.

관련; 당신이 원한다면 모의 초기화 콜이 필요하다.

마지막으로, 테스트 이름으로 판단 할 때이 모든 배선 (HandlerMappings, HandlerAdapters 등)을 수행하는 이유는 무엇입니까? 실제로 수행하려는 것은 MyReportController입니까? 필요에 따라 모의 요청, 응답 등으로 필요한 "끝점"메서드를 호출 할 수 없습니까?

+0

통합 테스트가 원래입니다. 테스트의 의도에 대한 설명없이 기본 코드를 받았습니다. 나중에 서비스를 통합 할 수 있도록 서비스를 조롱 할 수 없다는 것을 알고 있습니다. 컨트롤러의 bean이 테스트 설정 파일에 생성되지 않았다고 간단히 놓쳤습니다. 내가 한 일은 그것을 추가하는 것뿐이었습니다. – user1281598

관련 문제