首先,要有一个Spring MVC项目,不会的话,点这里看教程。

加入 maven 依赖:

    <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version></dependency><!-- spring test --><!-- 提供测试支持--> <dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>4.2.4.RELEASE</version></dependency>

被测试的类:SayHelloController。这个类不用改动,只是贴出来表明,通过 /SayHello/getAnswer 就可以访问到 helloWorld() 方法

@Controller
@RequestMapping("/SayHello")
public class SayHelloController {   @RequestMapping( path = "/getAnswer" , method = RequestMethod.GET)public String helloWorld() {return "redirect:/answer.jsp";}}

测试类:SayHelloControllerTest。按 ctrl+o 导入依赖。

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations={"classpath:applicationContext.xml","classpath:spring-servlet.xml"})
public class SayHelloControllerTest {@Autowiredprivate WebApplicationContext wac;private MockMvc mockMvc;@Beforepublic void setup()  {this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();}@Testpublic void testHelloWorld() throws Exception {mockMvc.perform(get("/SayHello/getAnswer")).andDo(print()).andExpect(status().is3xxRedirection()).andExpect(redirectedUrl("/answer.jsp"));}}

注意: 如果你的spring 和spring mvc 配置文件放在 /WEB-INF/ 目录下,那么选中 /WEB-INF/ 目录,“右键”–“build path”– “use as source folder” ,将两个配置文件加入到 classes目录下,因为 classpath:要求配置文件在classes目录下。
上面代码中的get方法需要静态引入,添加引入语句如下:
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;

完了,要做的只有这么多:增加依赖项,然后写一个测试类。可以通过 run as junit test 来看下效果。

上面的代码,可以看成一个模板+一个测试方法,模板如下:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations={"classpath:applicationContext.xml","classpath:spring-servlet.xml"})
public class SayHelloControllerTest {@Autowiredprivate WebApplicationContext wac;private MockMvc mockMvc;@Beforepublic void setup()  {this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();}// 下面写测试方法}

这个模板,只要改变配置文件的位置,其它不用动。模板代码的作用就是创建模拟的测试环境。

测试方法如下:

@Testpublic void testHelloWorld() throws Exception {mockMvc.perform(get("/SayHello/getAnswer")).andDo(print()).andExpect(status().is3xxRedirection()).andExpect(redirectedUrl("/answer.jsp"));}

上面这段代码,用 perform(get("/SayHello/getAnswer")) 发送一个请求,这个请求和真正的请求一样,会经过DispatcherServlet,然后调用被测试类SayHelloControllerhelloWorld()方法。

.andDo(print())是当请求执行完后,执行打印所有相关信息动作。print()是一个静态方法,来自MockMvcResultHandlers

.andExpect(status().is3xxRedirection())。.andExpect( 预期)判断实际响应与预期是否相等。比如这里,我断言发送/SayHello/getAnswer请求后,会返回一个响应,响应状态为3XX重定向。如果测试中,实际返回的是3XX重定向,这个方法不会出现问题,但如果返回的不是3XX,那么这个方法就会抛出异常,我们就知道被测试的类可能某个地方出现问题了。


项目代码

Spring 4 MVC 单元测试例子相关推荐

  1. Spring MVC学习总结(1)——Spring MVC单元测试

    关于spring MVC单元测试常规的方法则是启动WEB服务器,测试出错 ,停掉WEB 改代码,重启WEB,测试,大量的时间都浪费在WEB服务器的启动上,下面介绍个实用的方法,spring MVC单元 ...

  2. spring框架mvc框架_Spring MVC测试框架入门–第2部分

    spring框架mvc框架 这个迷你系列的第一个博客介绍了Spring MVC测试框架,并演示了其在单元测试Spring MVC Controller类中作为控制器而不是POJO进行单元测试的用途. ...

  3. Spring 3 MVC深入研究

    前言: 大家好,Spring3 MVC是非常优秀的MVC框架,由其是在3.0版本发布后,现在有越来越多的团队选择了Spring3 MVC了.Spring3 MVC结构简单,应了那句话简单就是美,而且他 ...

  4. Spring Boot干货系列:(十二)Spring Boot使用单元测试 | 嘟嘟独立博客

    原文地址 2017-12-28 开启阅读模式 Spring Boot干货系列:(十二)Spring Boot使用单元测试 Spring Boot干货系列 Spring Boot 前言 这次来介绍下Sp ...

  5. Spring Web MVC(一)

    概述 Spring Web MVC框架的特点 五大核心组件 编程步骤 五大核心组件 DispatcherServlet前端控制器 WebApplicationContext中特殊的bean 处理过程 ...

  6. 多个切点 boot spring_全网独家Spring/Cloud/MVC/Boot,脑图+面试+进阶,就问你服不服?...

    近期搜刮了一些Spring全家桶系列的思维脑图.经典面试题和进阶学习的PDF笔记(非常nice),Spring+SpringCloud+SpringMVC+SpringBoot,一个都没落下全都有!一 ...

  7. Spring Web MVC是什么

    2.1.Spring Web MVC是什么 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职 ...

  8. spring框架mvc框架_Spring的MVC测试框架入门–第1部分

    spring框架mvc框架 最新推出的主要Spring框架是Spring MVC测试框架,Spring Guys声称它是"一流的JUnit支持,可通过流畅的API测试客户端和服务器端Spri ...

  9. spring tiles_Spring MVC 3模板和Apache Tiles

    spring tiles 对于任何Web应用程序,有效的设计考虑因素是使用模板引擎(或工具),并且由于具有Spring的"可插拔"特性,集成模板机制(例如Apache Tiles) ...

最新文章

  1. 第二十二章:动画(十五)
  2. 在tomcat中部署mule项目
  3. Spring事务回滚和异常类
  4. Java JVM、JNI、Native Function Interface、Create New Process Native Function API Analysis
  5. 几万年前,有一只猴子大闹地府后删库跑路...
  6. How-to: Build VPP FD.IO development environment with Mellanox DPDK PMD.
  7. sqoop和sqoop2区别
  8. python的设计具有很强的可读性_Python是什么?具有怎么样的特点呢?
  9. tensorflow have no attribute enable_eager_execution() 问题解决
  10. linux 正向代理与反向代理
  11. LaTeX 注释一行的某一部分
  12. Graph_editor——好用的画图软件,你会用吗?
  13. 【七日阅书】1.注重实效《程序员修炼之道—从小工到专家》
  14. android_root后的玩机:magisk模块root隐藏/lsposedxposed框架的使用/MIUI小窗多开
  15. 荣耀v40和华为Nova8pro哪个好 华为Nova8pro和荣耀v40的区别
  16. PLC PLSY 指令
  17. 编程随想(编程学什么语言好)
  18. 台达DVP-EH3系列PLC如何实现远程编程调试和程序上下载?
  19. 2021-2027全球与中国自然对流烤炉市场现状及未来发展趋势
  20. QGIS源码编译步骤详解——官方新方案

热门文章

  1. 微信支付 签名算法 sign node实现
  2. rman全备时,配置项如何设置?
  3. superset 图标调整
  4. 查重多少合格_期刊论文查重一般多少合格?
  5. Java中BigDecimal的8种舍入模式
  6. machine id linux,linux – 机器ID是uuid吗?
  7. 1024电商项目的邮箱验证码与图形验证码功能模块
  8. 原来js的parseInt函数还可以这样用
  9. 目前微型计算机中常用的鼠标器有什么两类,2009年计算机一级考试真题及答案...
  10. 【剑指offer - C++/Java】8、跳台阶