如何使用Spring/JUnit验证控制器没有将我发送到不存在的视图



我使用的是Spring 3.1.1.RELASE和JUnit 4.11。我像一样设置JUnit测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:test-context.xml" })
public class MySpringTest 
{
    protected MockHttpServletRequest request;
    protected MockHttpServletResponse response;
    protected MockHttpSession session;
    @Autowired
    protected RequestMappingHandlerAdapter handlerAdapter;
    @Autowired
    protected RequestMappingHandlerMapping handlerMapping;

当测试控制器时,我有这行来验证控制器的方法返回的视图是正确的视图…

import static org.springframework.test.web.ModelAndViewAssert.assertViewName;
...
final ModelAndView mav = submitMyForm(…);
    assertViewName(mav, "folder/myView");
    ...
protected ModelAndView submitMyForm(… params ...) throws Exception {
    request = new MockHttpServletRequest();
    response = new MockHttpServletResponse();
    request.setRequestURI("/myurl");
    request.setMethod("POST");
    request.addParameter("param1", param1);
    ...
    final Object handler = handlerMapping.getHandler(request).getHandler();
    return handlerAdapter.handle(request, response, handler);
} 

我的问题是,一旦我验证了返回的视图。控制器是预期的视图,我如何验证它不会导致404?我现在遇到的主要问题是测试视图是否真的映射到我的WAR文件中的底层页面。

为什么不使用springmvc测试并做这样的事情?

@Autowired
private ViewResolver viewResolver;

//代码

View view = viewResolver.resolveViewName(viewName, locale);
//assert view not null

或者类似的东西,在wich中,您可以检查视图是否正常以及返回的状态(状态是200/404吗?)(此处为更多代码:http://goo.gl/fMqBsl)

@Test
public void indexTest() throws Exception {
    mockMvc.perform(get("/")).andDo(print())
        .andExpect(handler().handlerType(MainController.class))
        .andExpect(handler().methodName("index"))
        .andExpect(view().name("index"))
        .andExpect(forwardedUrl("/WEB-INF/tiles/template.jsp"))
        .andExpect(status().isOk());
}

我使用的是标准的jsp视图

基本上,您需要了解视图解析器。可以解决特定的视图吗?这意味着,如果您没有名为abc.xml的文件,它可能仍然是一个有效的视图。

为了简单起见,我们假设我们只有一个视图解析器,以及它的

"org.springframework.web.servlet.view.UrlBasedViewResolver"

这是bean的定义spring 3.2.4文档pdf,第477页

<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>

例如:视图名称"page1"=>/WEB-INF/jsp/page1.jsp和"admin/page2"=>/WEB-INF/jsp/admin/page2.jsp

使用它,您可以使用@Autowired和/或@Qualifier将解析的视图注入到您的junit测试中然后读取"prefix"和后缀值,找到完整路径,如"src/main/webapp/"+prefix+viewname+后缀

并检查该文件是否存在。

您可能有多个视图解析器,因此您可能希望注入上下文并使用策略模式处理视图=>文件名解析。

类似的东西

foreach resolver
{
if i can resolve the view to a file (resolver type, viewname)
return the physical filename
else
try next resolver
}

相关内容

  • 没有找到相关文章

最新更新