[英]Spring MVC - AlwaysUseFullPath configuration for annotation based mappings
[英]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.