[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.어노테이션 기반 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.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.HtmlUnit 또는 Selenium과 같이 Spring과 독립적 인 다른 웹 테스트 프레임 워크를 살펴볼 수도 있습니다. Sasha가 설명한 것 이외에 JUnit만으로는 더 강력한 전략을 찾지 못할 것입니다. 분명히 모델을 주장해야합니다.
HtmlUnit 또는 Selenium과 같이 Spring과 독립적 인 다른 웹 테스트 프레임 워크를 살펴볼 수도 있습니다. Sasha가 설명한 것 이외에 JUnit만으로는 더 강력한 전략을 찾지 못할 것입니다. 분명히 모델을 주장해야합니다.
from https://stackoverflow.com/questions/5774349/how-to-unit-test-a-spring-mvc-annotated-controller by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring MVC : 양식을 게시 할 때 추가되는 URL 경로 (0) | 2019.03.04 |
---|---|
[SPRING] 스프링 싱글 톤 빈은 쓰레드에 안전한가요? (0) | 2019.03.04 |
[SPRING] 스프링 보안을 사용하여 실패한 로그인에서 사용자 이름을 얻으려면 어떻게해야합니까? (0) | 2019.03.04 |
[SPRING] URL에서 jsessionid 제거 (0) | 2019.03.04 |
[SPRING] 스프링 보안으로 세션 ID 검색하기 (0) | 2019.03.04 |