关键字:Spring MVC 单元测试
下面一步一步带领大家实现spring MVC 单元测试:
新建一个基类:
package test;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.junit.BeforeClass;
import org.springframework.mock.web.MockServletContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.XmlWebApplicationContext;
import org.springframework.web.servlet.HandlerAdapter;
import org.springframework.web.servlet.HandlerExecutionChain;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter;
import org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping;
public class JUnitActionBase {
private static HandlerMapping handlerMapping;
private static HandlerAdapter handlerAdapter;
/**
* 读取spring3 MVC配置文件
*/
@BeforeClass
public static void setUp() {
if (handlerMapping == null) {
[color=red] String[] configs = { "classpath*:spring/*/*.xml","classpath*:applicationContext.xml","classpath:springMvc-servlet.xml"}; [/color]
XmlWebApplicationContext context = new XmlWebApplicationContext();
context.setConfigLocations(configs);
MockServletContext msc = new MockServletContext();
context.setServletContext(msc);
context.refresh();
msc.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, context);
handlerMapping = (HandlerMapping) context
.getBean(DefaultAnnotationHandlerMapping.class);
handlerAdapter = (HandlerAdapter) context.getBean(context.getBeanNamesForType(AnnotationMethodHandlerAdapter.class)[0]);
}
}
/**
* 执行request对象请求的action
*
* @param request
* @param response
* @return
* @throws Exception
*/
public ModelAndView excuteAction(HttpServletRequest request, HttpServletResponse response)
throws Exception {
HandlerExecutionChain chain = handlerMapping.getHandler(request);
// 这里需要声明request的实际类型,否则会报错
request.setAttribute(HandlerMapping.INTROSPECT_TYPE_LEVEL_MAPPING, true);
final ModelAndView model = handlerAdapter.handle(request, response,chain.getHandler());
return model;
}
/**
* 执行request对象请求的action(针对没有返回值的action方法)
*
* @param request
* @param response
* @return
* @throws Exception
*/
public void excuteActionWithJson(HttpServletRequest request, HttpServletResponse response)
throws Exception {
HandlerExecutionChain chain = handlerMapping.getHandler(request);
// 这里需要声明request的实际类型,否则会报错
request.setAttribute(HandlerMapping.INTROSPECT_TYPE_LEVEL_MAPPING, true);
handlerAdapter.handle(request, response,chain.getHandler());
}
}
定义测试controller类
package test;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
public class HelloActionTest extends JUnitActionBase {
/**
* 每个方法执行前
* @throws Exception
*/
@Before
public void before() throws Exception{
System.out.println("方法执行前...........");
}
/**
* 每个方法执行后
* @throws Exception
*/
@After
public void after() throws Exception{
System.out.println("方法执行后...........");
}
@Test
public void testAdd() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
// request.setLocalPort(8080);
request.setRequestURI("/w/postmodel");
request.addParameter("id", "1002");
//request.addParameter("date", "2010-12-30");
request.setMethod("GET");
// 执行URI对应的action
final ModelAndView mav = this.excuteAction(request, response);
// Assert logic
Assert.assertEquals("views/demo/postmodel", mav.getViewName());
// String msg=(String)response.getAttribute("message");
Object msg=mav.getModel().get("param");
System.out.println(msg);
}
@Test
public void testGet() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
request.setLocalPort(8080);//该选项可不设置
// request.setServletPath("/strategy/page");//另一种设置url的方式
request.setRequestURI("/strategy/page");
request.addParameter("pageNo", "2");
request.addParameter("pagesize", "20");
request.setMethod("GET");
request.setAttribute("msg", "测试action成功");
// 执行URI对应的action
final ModelAndView mav = this.excuteAction(request, response);
// Assert logic
Assert.assertEquals("views/strategy/page", mav.getViewName());
// String msg=(String)response.getAttribute("message");
Object msg=mav.getModel().get("param");
System.out.println(msg);
String msg2=(String)request.getAttribute("msg");
System.out.println(msg2);
}
}
[color=red]
说明:这里不再定义具体的控制层,你自己的写的控制类通过在测试类里面设置访问uri和相关参数即可[/color]
点击》run as或debug as》juint测试
补充说明:
需要测试dao层时,若是dao层包nullpointException,有可能是你的数据库连接datasource使用代理或是其他,则需要重新在spring的配置文件配置bean id=datasource,