我使用的是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
}