1

我正在使用 Spring 3.1.1.RELEASE 和 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;

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

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 文件中的底层页面。

4

2 回答 2

1

为什么不使用 spring-mvc-test 并做这样的事情?

@Autowired
private ViewResolver viewResolver;

// 代码

View view = viewResolver.resolveViewName(viewName, locale);

//assert view not null

或类似的东西,您可以检查视图是否正常和返回的状态(状态为 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());
}
于 2013-08-23T12:19:17.193 回答
0

我正在使用标准的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测试的视图,然后读取“前缀”和后缀值并找到完整路径,如“src/main/webapp/”+前缀+视图名+后缀

并检查文件是否存在。

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

就像是

foreach resolver
{
if i can resolve the view to a file (resolver type, viewname)
return the physical filename
else
try next resolver
}
于 2013-08-23T10:52:38.550 回答