首页 > 其他分享 >Spring MVC 单元测试

Spring MVC 单元测试

时间:2023-05-06 16:07:04浏览次数:32  
标签:web Spring 单元测试 request springframework MVC import org response


关键字: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,

标签:web,Spring,单元测试,request,springframework,MVC,import,org,response
From: https://blog.51cto.com/u_7450530/6250437

相关文章

  • spring3.0 mvc和rest入门例子
    关键字:spring3.0mvc和rest入门例子现在写个简单的小例子出来给初学者学习下。srping3也支持rest,所以例子也包括这部分内容。先看web.xml配置<!--像js,css,gif等静态文件,需要配置为默认的servlet--><servlet-mapping><servlet-name>defaul......
  • spring3.0 mvc rest 注解之@
    关键字:springmvcrest注解之@@RequestMapping@RequestParam@PathVariable@ModelAttributes@SessionAttributes@CookieValue@RequestHeader都是SpringMVCREST中的注释方法,这几种注释方法的用法如下:1#Controller示例URL示例:POST/users/quer......
  • spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件)
    关键字:spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件)应用场景:很多时候我们想要在某个类加载完毕时干某件事情,但是使用了spring管理对象,我们这个类引用了其他类(可能是更复杂的关联),所以当我们去使用这个类做事情时发现包空指针错误,这是因为我们......
  • SpringBoot 操作 MongoDB 新增和查询
    MongoDBJAVA新增+查询上接SpringBoot整合MongoDB,记一下MongoDB的CRUD方法。Create新增使用MongoRepository方式的新增非常简单,之前的整合中已经尝试过,这里再总结一下:首先需要有对应的实体类对象:@Data@AllArgsConstructor@NoArgsConstructor@ToStringpublicc......
  • 聊聊关于,SpringBoot写后端接口
    前言:一个后端接口大致分为四个部分组成:接口地址(url)、接口请求方式(get、post等)、请求数据(request)、响应数据(response)。如何构建这几个部分每个公司要求都不同,没有什么“一定是最好的”标准,但一个优秀的后端接口和一个糟糕的后端接口对比起来差异还是蛮大的,其中最重要的关键点就是......
  • Spring17_JdbcTemplate基本使用12
    一、概述(了解)JdbcTemplate是spring框架中提供的一个对象,是对原始繁琐的JdbcAPI对象的简单封装。spring框架为我们提供了很多的操作模板类。例如:操作关系型数据的JdbcTemplate和HibernateTemplate,操作nosql数据库的 RedisTemplate,操作消息队列的JmsTemplate等等。......
  • spring cloud gradle mybatis
    一、引入依赖在build.gradle文件中的dependencies的对象中引入依赖implementation'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.4'二、配置数据库及mybatis在application.yml文件中配置数据库spring:datasource:url:jdbc:mysql://192.168.0.1:3306/dbName......
  • spring cloud 配置 redis、定义redis工具类
    一、引入redis工具依赖在build.gradle文件中的dependencies的对象中引入依赖compile'org.springframework.boot:spring-boot-starter-data-redis:2.1.5.RELEASE'二、application.xml配置redisspringredis:database:#Redis数据库索引(默认为0)host:......
  • spring cloud、gradle、父子项目、微服务框架搭建---搭建父子级多模块项目,并注册到Eu
    一、新建一个父级gradl模块1.在桌面或新建文件里面,右键,打开IDEA选择Flie>NEW>Module选择Gradle,选择ModuleSDK1.8,选择Java创建完成后,idea中会多出一个项目,如下图示例然后直接关闭当前idea,进入刚才创建好的文件下,再次打开项目可以直接删除src目录二、新建子级gradl模......
  • SpringBoot 自动扫描第三方包及spring.factories失效的问题
    为什么会找不到Spring依赖注入就是要让spring找到要注入的类并且识别到了@Component、@Service等注解。1.当在开发的第三方包里写明了@Component、@Service等等2.引入了包,不论第三方库的引入,还是本地jar。总之是要引入到工程的这时候还加入不到IOC容器,那就说明Spri......