복붙노트

[SPRING] 스프링 MVC 주석 컨트롤러의 단위 테스트 방법

SPRING

스프링 MVC 주석 컨트롤러의 단위 테스트 방법

나는 Spring 2.5 튜토리얼을 따르고 있으며, 동시에 Spring 3.0으로 코드 / 설정을 업데이트하려고 노력 중이다.

Spring 2.5에서 HelloController를 참조했다.

public class HelloController implements Controller {
    protected final Log logger = LogFactory.getLog(getClass());
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        logger.info("Returning hello view");
        return new ModelAndView("hello.jsp");
    }
}

HelloController에 대한 JUnit 테스트 (참조 용) :

public class HelloControllerTests extends TestCase {
    public void testHandleRequestView() throws Exception{
        HelloController controller = new HelloController();
        ModelAndView modelAndView = controller.handleRequest(null, null);
        assertEquals("hello", modelAndView.getViewName());
    }
}

하지만 이제 컨트롤러를 Spring 3.0으로 업데이트했고 이제 주석을 사용합니다 (또한 메시지를 추가했습니다).

@Controller
public class HelloController {
    protected final Log logger = LogFactory.getLog(getClass());
    @RequestMapping("/hello")
    public ModelAndView handleRequest() {
        logger.info("Returning hello view");
        return new ModelAndView("hello", "message", "THIS IS A MESSAGE");
    }
}

JUnit 4.9를 사용하고 있음을 알면,이 마지막 컨트롤러를 단위 테스트하는 방법을 설명 할 수 있습니까?

해결법

  1. ==============================

    1.어노테이션 기반 Spring MVC의 한 가지 이점은 다음과 같이 간단하게 테스트 할 수 있다는 점이다.

    어노테이션 기반 Spring MVC의 한 가지 이점은 다음과 같이 간단하게 테스트 할 수 있다는 점이다.

    import org.junit.Test;
    import org.junit.Assert;
    import org.springframework.web.servlet.ModelAndView;
    
    public class HelloControllerTest {
       @Test
       public void testHelloController() {
           HelloController c= new HelloController();
           ModelAndView mav= c.handleRequest();
           Assert.assertEquals("hello", mav.getViewName());
           ...
       }
    }
    

    이 접근 방식에 문제가 있습니까?

    보다 진보 된 통합 테스트를 위해서 Spring 문서에는 org.springframework.mock.web에 대한 참조가있다.

  2. ==============================

    2.mvc : annotation-driven을 사용하면 두 단계가 필요합니다. 먼저 HandlerMapping을 사용하여 요청을 처리기로 처리 한 다음 HandlerAdapter를 통해 해당 처리기를 사용하여 메서드를 실행할 수 있습니다. 같은 것 :

    mvc : annotation-driven을 사용하면 두 단계가 필요합니다. 먼저 HandlerMapping을 사용하여 요청을 처리기로 처리 한 다음 HandlerAdapter를 통해 해당 처리기를 사용하여 메서드를 실행할 수 있습니다. 같은 것 :

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("yourContext.xml")
    public class ControllerTest {
    
        @Autowired
        private RequestMappingHandlerAdapter handlerAdapter;
    
        @Autowired
        private RequestMappingHandlerMapping handlerMapping;
    
        @Test
        public void testController() throws Exception {
            MockHttpServletRequest request = new MockHttpServletRequest();
            // request init here
    
            MockHttpServletResponse response = new MockHttpServletResponse();
            Object handler = handlerMapping.getHandler(request).getHandler();
            ModelAndView modelAndView = handlerAdapter.handle(request, response, handler);
    
            // modelAndView and/or response asserts here
        }
    }
    

    이것은 Spring 3.1에서 작동하지만,이 버전의 일부가 모든 버전에 존재해야한다고 생각합니다. Spring 3.0 코드를 보면 DefaultAnnotationHandlerMapping과 AnnotationMethodHandlerAdapter가 그 트릭을 수행해야한다고 말하고 싶다.

  3. ==============================

    3.HtmlUnit 또는 Selenium과 같이 Spring과 독립적 인 다른 웹 테스트 프레임 워크를 살펴볼 수도 있습니다. Sasha가 설명한 것 이외에 JUnit만으로는 더 강력한 전략을 찾지 못할 것입니다. 분명히 모델을 주장해야합니다.

    HtmlUnit 또는 Selenium과 같이 Spring과 독립적 인 다른 웹 테스트 프레임 워크를 살펴볼 수도 있습니다. Sasha가 설명한 것 이외에 JUnit만으로는 더 강력한 전략을 찾지 못할 것입니다. 분명히 모델을 주장해야합니다.

  4. from https://stackoverflow.com/questions/5774349/how-to-unit-test-a-spring-mvc-annotated-controller by cc-by-sa and MIT license