簡體   English   中英

測試Spring MVC注釋映射

[英]Testing Spring MVC annotation mappings

使用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請求進入時,Spring框架是否會調用getImage()。我覺得我還需要對此部分進行測試,特別是當我的@RequestMapping注釋變得更復雜並調用時復雜的參數條件。

如果我刪除第4行,@ @RequestMapping("getImage") ,你能告訴我一個測試會破壞嗎?

您可以以編程方式使用AnnotationMethodHandlerAdapter及其handle方法。 這將解析給定請求的方法並執行它。 不幸的是,這有點間接。 實際上在AMHA中有一個名為ServletHandlerMethodResolver的私有類,它負責解析給定請求的方法。 我剛剛提出了關於該主題的改進請求 ,因為我真的希望看到這也是可能的。

在此期間,您可以使用例如EasyMock來創建控制器類的模擬,期望調用給定的方法並將該模擬handle

控制器:

@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);
  }
}

此致,奧利

Ollie的解決方案包括測試注釋的具體示例,但是如何測試所有其他各種Spring 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注釋博客文章

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM