복붙노트

[SPRING] 스프링 MVC 주석 매핑 테스트하기

SPRING

스프링 MVC 주석 매핑 테스트하기

Spring MVC를 사용하면 특정한 메소드가 특정 URL을 처리하도록 지정할 수 있으며 특정 매개 변수가 다음과 같이 특정 인수에 매핑되도록 지정할 수있다.

@Controller
public class ImageController {

   @RequestMapping("/getImage")
   public String getImage( @RequestParam("imageId") int imageId, Map<String,Object> model ) {
      model.put("image",ImageService.getImage(imageId));
   }

}

이것은 모두 훌륭하지만, 이제는 imageId 매개 변수가있는 http 요청이이 메소드를 올바르게 호출하는지 테스트하려고합니다. 즉, 주석을 제거하거나 변경하면 중단되는 테스트가 필요합니다. 이것을 할 수있는 방법이 있습니까?

getImage가 올바르게 작동하는지 테스트하기 쉽습니다. ImageController를 만들고 적절한 인수를 사용하여 getImage를 호출 할 수 있습니다. 그러나 이것은 테스트의 절반에 불과합니다. 테스트의 나머지 절반은 적절한 HTTP 요청이 들어올 때 getImage ()가 Spring 프레임 워크에 의해 호출 될지 여부 여야합니다. 특히 @RequestMapping 주석이 더 복잡해지고 호출되기 때문에이 부분에 대한 테스트가 필요합니다. 복잡한 매개 변수 조건.

@RequestMapping ( "getImage") 4 행을 제거하면 중단되는 테스트를 표시 할 수 있습니까?

해결법

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

    1.AnnotationMethodHandlerAdapter와 그 핸들 메소드를 프로그램 적으로 사용할 수 있습니다. 그러면 주어진 요청에 대한 메소드가 분석되고 실행됩니다. 불행히도 이것은 약간 간접적입니다. 실제로 AMHA에있는 ServletHandlerMethodResolver라는 private 클래스가 있는데, 이는 주어진 요청에 대한 메소드를 해결하는 역할을합니다. 나는이 주제에 대한 개선 요청을 제출했다. 실제로이 사실을보고 싶다.

    AnnotationMethodHandlerAdapter와 그 핸들 메소드를 프로그램 적으로 사용할 수 있습니다. 그러면 주어진 요청에 대한 메소드가 분석되고 실행됩니다. 불행히도 이것은 약간 간접적입니다. 실제로 AMHA에있는 ServletHandlerMethodResolver라는 private 클래스가 있는데, 이는 주어진 요청에 대한 메소드를 해결하는 역할을합니다. 나는이 주제에 대한 개선 요청을 제출했다. 실제로이 사실을보고 싶다.

    그 동안에는 예를 들어 EasyMock을 사용하여 컨트롤러 클래스의 모의 객체를 생성하고 주어진 메소드가 호출 될 것으로 예상하고 해당 모의 객체를 처리하도록하십시오.

    제어 장치:

    @Controller
    public class MyController {
    
      @RequestMapping("/users")
      public void foo(HttpServletResponse response) {
    
        // your controller code
      }
    }
    

    테스트:

    public class RequestMappingTest {
    
      private MockHttpServletRequest request;
      private MockHttpServletResponse response;
      private MyController controller;
      private AnnotationMethodHandlerAdapter adapter;
    
    
      @Before
      public void setUp() {
    
        controller = EasyMock.createNiceMock(MyController.class);
    
        adapter = new AnnotationMethodHandlerAdapter();
        request = new MockHttpServletRequest();
        response = new MockHttpServletResponse();
      }
    
    
      @Test
      public void testname() throws Exception {
    
        request.setRequestURI("/users");
    
        controller.foo(response);
        EasyMock.expectLastCall().once();
        EasyMock.replay(controller);
    
        adapter.handle(request, response, controller);
    
        EasyMock.verify(controller);
      }
    }
    

    문안 인사, 사진

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

    2.Ollie의 솔루션은 주석의 특정 예제를 테스트하는 것을 다루지 만, 다른 모든 다양한 MVC 주석을 테스트하는 방법에 대한 더 광범위한 질문은 무엇에 관한 것인가? 내 접근법 (다른 주석으로 쉽게 확장 될 수 있음)은

    Ollie의 솔루션은 주석의 특정 예제를 테스트하는 것을 다루지 만, 다른 모든 다양한 MVC 주석을 테스트하는 방법에 대한 더 광범위한 질문은 무엇에 관한 것인가? 내 접근법 (다른 주석으로 쉽게 확장 될 수 있음)은

    import static org.springframework.test.web.ModelAndViewAssert.*;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration({/* include live config here
        e.g. "file:web/WEB-INF/application-context.xml",
        "file:web/WEB-INF/dispatcher-servlet.xml" */})
    public class MyControllerIntegrationTest {
    
        @Inject
        private ApplicationContext applicationContext;
    
        private MockHttpServletRequest request;
        private MockHttpServletResponse response;
        private HandlerAdapter handlerAdapter;
        private MyController controller;
    
        @Before
        public void setUp() {
           request = new MockHttpServletRequest();
           response = new MockHttpServletResponse();
           handlerAdapter = applicationContext.getBean(HandlerAdapter.class);
           // I could get the controller from the context here
           controller = new MyController();
        }
    
        @Test
        public void testFoo() throws Exception {
           request.setRequestURI("/users");
           final ModelAndView mav = handlerAdapter.handle(request, response, 
               controller);
           assertViewName(mav, null);
           assertAndReturnModelAttributeOfType(mav, "image", Image.class);
        }
    }
    

    Spring MVC 주석에 대한 통합 테스트에 대한 블로그 항목도 작성했습니다.

  3. from https://stackoverflow.com/questions/861089/testing-spring-mvc-annotation-mappings by cc-by-sa and MIT license