3

我正在使用 Spring 3.2.11.RELEASE 和 JUnit 4.11。在一个特定的 Spring 控制器中,我有一个这样结束的方法......

return new ModelAndView(new RedirectView(redirectUri, true));

在我的 JUnit 测试中,如何验证从提交到返回此 RedirectView 的控制器的返回?我曾经使用 org.springframework.test.web.AbstractModelAndViewTests.assertViewName,但它只返回“null”,即使返回非空 ModelAndView 对象也是如此。这是我构建 JUnit 测试的方式...

    request.setRequestURI(“/mypage/launch");
    request.setMethod("POST");
    …
   final Object handler = handlerMapping.getHandler(request).getHandler();
    final ModelAndView mav = handlerAdapter.handle(request, response,  handler);
    assertViewName(mav, "redirect:/landing");

任何有关如何验证 RedirectView 是否返回正确值的帮助都非常感谢,

4

2 回答 2

9

正如 Koiter 所说,考虑转向弹簧测试 a 和MockMvc

它提供了一些以声明方式测试控制器和请求/响应的方法

你需要一个@Autowired WebApplicationContext wac;

并在您的@Before方法上设置它以使用@WebAppConfiguration该类。

你最终会得到一些东西

 @ContextConfiguration("youconfighere.xml")
 //or (classes = {YourClassConfig.class}
 @RunWith(SpringJUnit4ClassRunner.class)
 @WebAppConfiguration
 public class MyControllerTests {

 @Autowired WebApplicationContext wac
 private MockMvc mockMvc;


 @Before
 public void setup() {
      //setup the mock to use the web context
      this.mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); 
   }
}

然后你只需要使用MockMvcResultMatchers来断言事情

 @Test
  public void testMyRedirect() throws Exception {
   mockMvc.perform(post("you/url/")
    .andExpect(status().isOk())
    .andExpect(redirectUrl("you/redirect")
}

注意:post(), status() isOk() redirectUrl()是从静态导入MockMvcResultMatchers

在此处查看更多您可以匹配的内容

于 2015-04-27T22:09:19.700 回答
0

考虑将您的工具更改为 MockMvc。

首先,您应该根据您的控制器创建您的 MockMvc。

private MockMvc mockController;

    mockController =
            MockMvcBuilders.standaloneSetup(loginController).setCustomArgumentResolvers(
                    new ServletWebArgumentResolverAdapter(new PageableArgumentResolver())).build();

创建该对象后,使用请求信息构建请求。其中一部分是 API 中包含的断言选项。

mockController.perform(MockMvcRequestBuilders.get(LoginControllerTest.LOGIN_CONTROLLER_URL + "?logout=true").
                principal(SessionProvider.getPrincipal("GonLu004")))
                .andDo(MockMvcResultHandlers.print())
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.view().name("jsp/login"))
                .andExpect(MockMvcResultMatchers.model().attribute("logOutMessage", logoutMessage));

MockMvcResultMatchers包含一个查看重定向信息的方法

Spring 的MockMvc是在控制器层上应用单元测试的不错选择。

于 2015-04-27T21:47:35.183 回答