1

Spring (3.0) の以前のバージョンでは、ApplicationContext の RequestMappingHandlerAdapter および HandlerMapping オブジェクトを使用して、正しい URL を介してコントローラーをテストすることができました。しかし、Spring 3.1 では状況が変わり、これを機能させるために使用していたコードは機能しなくなりました。

Spring 3.1 で Spring コントローラーの URL をどのようにテストしますか? たとえば、次のようなコードを書きたいと思います。

ModelAndView modelAndView = handle("GET", "/businesses");

このようにして、コントローラーのアクション ロジックに加えてマッピングをテストしています。

特に、セッション属性を渡して、それらをコントローラー アクションの @Valid アノテーションに正しく渡すことができるようにすることに最も関心があります。

Spring 3.1 でこれを達成する方法はありますか?

これは私が使用していたコードです:

protected ModelAndView handle(HttpServletRequest request, HttpServletResponse response) throws Exception {
    final HandlerMapping handlerMapping = applicationContext.getBean(RequestMappingHandlerMapping.class);

    final HandlerExecutionChain handler = handlerMapping.getHandler(request);
    assertNotNull("No handler found for request, check you request mapping", handler);

    final Object controller = handler.getHandler();

    final HandlerInterceptor[] interceptors = handlerMapping.getHandler(request).getInterceptors();
    for (HandlerInterceptor interceptor : interceptors) {
        final boolean carryOn = interceptor.preHandle(request, response, controller);
        if (!carryOn) {
            return null;
        }
    }

    return handlerAdapter.handle(request, response, controller);
}

protected ModelAndView handle(String method, String path, String queryString) throws Exception {
    request.setMethod(method);
    request.setRequestURI(path);

    if(queryString != null) {
        String[] parameters = queryString.split("&");
        for(String parameter : parameters) {
            String[] pair = parameter.split("=");
            if(pair.length == 2) {
                request.setParameter(pair[0], pair[1]);
            } else {
                request.setParameter(pair[0], "");
            }
        }
    }

    return handle(request, response);
}

protected ModelAndView handle(String method, String path, String attribute, Object object) throws Exception {
    MockHttpSession session = new MockHttpSession();
    session.setAttribute(attribute, object);
    request.setSession(session);

    return handle(method, path, null);
}

protected ModelAndView handle(String method, String path) throws Exception {
    return handle(method, path, null);
}

protected void assertContentType(ModelAndView modelAndView, String contentType) {
    assertEquals(contentType, modelAndView.getView().getContentType());
}
4

3 に答える 3

1

代わりに、現在 1.0.0M1 ですが、新しい Spring MVC バージョンにパッケージ化される予定の spring-test-mvcをお勧めします。探しているケースを非常に簡単に処理できるはずです。テストは次のようになります。

xmlConfigSetup("classpath:/META-INF/spring/web/webmvc-config.xml")
            .configureWebAppRootDir("src/main/webapp", false).build()
            .perform(get("/businesses").param("name", "param1"))
            .andExpect(status().isOk())
            .andExpect(view().name("viewname"));

あなたのテストは 3.1 に適しているように見えます。そのため、引き続きアプローチを続けたい場合は、何が機能していないかを正確に指摘できますか?

于 2012-10-10T00:20:38.607 に答える
1

これは、Spring 3.1 で使用したテスト ケースの 1 つです。それがあなたの要件を満たすことを願っています。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml" })
public class ControllerTest {
    @Autowired
    private RequestMappingHandlerAdapter handleAdapter;

    @Autowired
    private RequestMappingHandlerMapping handlerMapping;
    @Test
    public void playerControllerTest() throws Exception{

        MockHttpServletRequest request = new MockHttpServletRequest();
        MockHttpServletResponse response = new MockHttpServletResponse();
        request.setRequestURI("/players.show");
        request.setMethod("GET");

        Object handler = handlerMapping.getHandler(request).getHandler();
        ModelAndView mav = handleAdapter.handle(request, response,handler);

        ModelAndViewAssert.assertViewName(mav,"players");

    }

}
于 2012-10-08T08:24:30.290 に答える
0

これは、Spring 3.1 クラスとコントローラーのテストについて説明している非常に優れたプレゼンテーションです。以下に例を示します

@Test
public void testSave() {

    Account account = new Account();
    BindingResult result = 
        new BeanPropertyBindingResult(account, "account");

    AccountManager mgr = createMock(AccountManager.class);
    mgr.saveOrUpdate(account);
    replay(mgr);

    AccountController contrlr = new AccountController(mgr);

    String view = contrlr.save(account, result);

    assertEquals("redirect:accounts", view);
    verify(mgr);
}

それが役立つことを願っています!

于 2012-10-08T05:10:05.773 に答える