SpringMVC + JUnit4 单元测试 - Controller 测试
SpringMVC + JUnit4 单元测试
- 依赖
- 普通测试
- Controller 测试
- 创建 Controller 测试基类
- 创建 Controller 单元测试类
- Eclipse
- IDEA
- 导入静态方法
- 总结
- 参考资料
依赖
只展示单元测试相关的部分
ssm/pom.xml
<properties><junit.version>4.12</junit.version><spring.version>4.3.9.RELEASE</spring.version>...</properties><dependencies><!-- 测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version><scope>test</scope> </dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version></dependency>...</dependencies>
普通测试
/ssm/src/test/java/com/jerry/ssm/mapper/PoemMapperTest.java
package com.jerry.ssm.mapper;import java.util.List;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.jerry.ssm.entity.Poem;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class PoemMapperTest{@Resourceprivate PoemMapper poemMapper;@Testpublic void selectListTest() {List<Poem> poemList = poemMapper.selectList(null);for (Poem poem : poemList) {System.out.println(poem);}}
}
Controller 测试
创建 Controller 测试基类
为了与Dao
、Service
分开所以 Controller
层单写一个基类,跟当前阶段无关的能不加载就省一下。
@RunWith(SpringJUnit4ClassRunner.class)
:照规矩写上即可。@WebAppConfiguration
:加载web上下文WebApplicationContext
,测controller层必须地。。。@ContextConfiguration(locations = { "classpath:application-spring.xml","classpath:application-web.xml" })
:
3.1.spring配置、spring-mvc配置
都要加载。
3.2. 正常我们都在spring配置
排除了对Controller
的扫描,交给spring-mvc配置
来管了对吧。
3.3. 为了将开发环境
和测试环境
分开,所有用到的配置文件都在src/test/resources/
单独创建了一份。跑单元测试时会优先来这里,这里没有才去src/java/resources/
找。
/ssm/src/test/java/com/jerry/ControllerBaseTest.java
package com.jerry;import org.junit.Before;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;/*** 单元测试基类* * @author jerryjin* @date 2019-06-02 17:02:30*/
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration(value = "src/main/webapp")
@ContextConfiguration(locations={"classpath:applicationContext.xml","classpath:spring-mvc.xml"})
@ComponentScan(basePackages={"com.jerry.ssm.controller", "com.jerry.ssm.service"})
// 如果不想测试产生的数据保存下来。可以开启事务默认回滚
//@Transactional
//@TransactionConfiguration( transactionManager = "transactionManager", defaultRollback = true)
public class ControllerBaseTest {@Autowiredprivate WebApplicationContext webApplicationContext;protected MockMvc mockMvc;protected MockHttpServletRequest request;protected MockHttpServletResponse response;/*** 初始化SpringmvcController类测试环境*/@Beforepublic void setup(){//加载web容器上下文mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();}}
创建 Controller 单元测试类
Eclipse
- 选中
PoemController.java
- 点击热键
Ctrl + N
- 注意:
1、就测试文件放置的位置。
2、是让此单元测试继承:测试基类ControllerBaseTest
- 选择要测试的方法
IDEA
在要被测试的 xxxController.java
文件中:
- 右键
Generate
或直接热键:Alt + Insert
- 选择
Test...
- 创建测试类
- 选择Junit 版本
- 测试类名称(通常就是原类加上
Test
结尾) - 测试类的父类:一般我们把一些基础配置写在父类,然后测试类直接继承即可。
- 测试类包名:与原类保持一致即可。
- 测试前后要执行的一些操作,能在父类统一写好的尽量在父类写。
- 选择要创建单元测试的方法。
/ssm/src/test/java/com/jerry/ssm/controller/PoemControllerTest.java
package com.jerry.ssm.controller;import java.io.UnsupportedEncodingException;
import org.junit.Test;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import com.jerry.ControllerBaseTest;public class PoemControllerTest extends ControllerBaseTest {@Testpublic void testGetPome() throws UnsupportedEncodingException, Exception {ResultActions resultActions = mockMvc.perform(MockMvcRequestBuilders.get("/pome")// 数据的格式请求的url,请求的方法是 get.contentType(MediaType.APPLICATION_FORM_URLENCODED)// 数据的格式 .param("id","1")// 添加参数);MvcResult mvcResult = resultActions
// .andDo(MockMvcResultHandlers.print())// 打印出请求和相应的内容。如跳转视图的name以及传给视图的数据
// .andExpect(MockMvcResultMatchers.status().isOk()) //判断返回状态是否200.andReturn();String result = mvcResult.getResponse().getContentAsString();System.out.println(result);}
}
输出结果
{"data":{"id":1,"title":"痴情癫","content":"<p>多情黯叹痴情癫,痴情苦笑多情难。</p><p>相思自古无良药,从来独步赴黄泉。</p","author":"笑虾"}
}
导入静态方法
网上很多代码没有看到MockMvcRequestBuilders
直接就使用get()、post()、status(), print()
,又偏不开告诉你引用的哪个类。
mark下位置,没有的就在附近找找看不会太远。
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
总结
因为JUnit
创建项目时都带了,所以基本就是添加spring-test
依赖,然后创建单元测试并加上注解就行了。
对于controller
单元测试,感觉还是满麻烦的,如果要用,最好还是把模拟请求的方法都封装一下。
参考资料
SpringBoot 学习笔记 【单元测试】
SpringMVC + JUnit4 单元测试 - Controller 测试相关推荐
- junit4 单元测试框架_超越JUnit –测试框架的替代方案
junit4 单元测试框架 JUnit是事实上的Java单元测试框架,但是可能有一些新的(不是那么新的)框架可以用于Web开发. 在采用之前可能要问自己的问题: 它们是否快速,容易开发并因此成本低廉? ...
- IDEA中Maven项目使用Junit4单元测试的写法
IDEA默认是安装了junit控件的,直接使用就好了 在maven项目的pom.xml文件中添加依赖 <dependency><groupId>junit</groupI ...
- JUnit4 单元测试框架
序言 刚学Java的时候就听说过JUnit了,单元测试框架,很好用的测试框架,JUnit测试框架将测试更加便捷和容易,编写测试代码也是简单.明了,功能强大.今天给大家简单分享一下最新JUnit4的使用 ...
- JUnit4单元测试
我们在编写大型程序的时候,需要写成千上万个方法或函数,这些函数的功能可能很强大,但我们在程序中只用到该函数的一小部分功能,并且经过调试可以确定,这一小部分功能是正确的.但是,我们同时应该确保每一个函数 ...
- Scala使用JUnit4单元测试
Scala使用JUnit4单元测试 Maven pom: <dependency><groupId>junit</groupId><artifactId> ...
- 使用Spring+Junit4.4进行测试
http://nottiansyf.iteye.com/blog/345819 使用Junit4.4测试 在类上的配置Annotation @RunWith(SpringJUnit4ClassRu ...
- 如何在单元测试中测试异步函数,block回调这种
大概有四种方法: runloop 阻塞主进程等待结果 semphaore 阻塞主进程等待结果 使用XCTestExpectation 阻塞主线程等待(我用这个,xcode自带的,为啥不用) 使用第三方 ...
- 单元测试怎么测试线程_单元测试线程代码的5个技巧
单元测试怎么测试线程 以下是一些技巧,说明如何进行代码的逻辑正确性测试(与多线程正确性相对). 我发现本质上有两种带有线程代码的刻板印象模式: 面向任务-许多短期运行的同类任务,通常在Java 5执行 ...
- VS2015+NUnit+OpenCover 完成单元测试代码覆盖率测试
1.VS2015+NUnit+OpenCover 完成单元测试代码覆盖率测试 https://download.csdn.net/download/qq_39441918/10522539 2.*注意 ...
- tSQLt单元测试的测试驱动数据库开发(TDDD)基础
This article talks about core concepts of test-driven database development followed by creating simp ...
最新文章
- NSArray与NSString、NSData,NSDictionary与NSString、NSData 相互转化
- 设计模式 — 行为型模式 — 解释器模式
- Java中static的作用
- iOS----------iPhone导出手机所有短信
- windows系统下 VUE cli手脚架环境安装
- SAP Spartacus 从 Ngrx 里获取 navigation 的实时状态
- Emmet:HTML/CSS代码快速编写神器
- 基于 MyBatis 手撸一个分表插件
- iPhone11翻车了?发烫严重、信号依旧差...
- mysql不支持emoji表情的问题的解决方法
- Linux 文件权限、用户权限和用户组管理vim的一些基本使用技巧
- 12306网上买火车票怎么选择上中下铺
- 两根硬铜线并线接插座_两根硬铜线正确接法
- Odoo的采购入库单、销售发货单整单被取消,或选择了不生成欠单后又想继续入库或发货,如何处理?
- 优秀的程序员是没有性生活的
- 智能测试实践之路-UI 缺陷检测
- java迷宫鼠_C++ 迷宫算法(迷宫老鼠)
- 中国历史和世界史横向对照表,收藏了长知识。 ​​​​
- MATLAB 打不开coder,MATLAB CODER初次使用的错误提示,希望大侠可以帮忙解决!...
- OpenGL 动画的制作
热门文章
- Android编码规范
- 机器学习(6): 决策树算法 小结与实验
- conan入门(六):conanfile.txt conanfile.py的区别
- 基于JAVA超市自助购物系统的设计与实现
- python群聊机器人_基于python-wechaty的群聊助手机器人
- ctfmon是什么启动项_win7启动项没有ctfmon.exe的解决方法
- 数据中心建筑及装修施工工序工艺管理要点
- iPhone5捣鼓mobile terminal
- DB2 JDBC Driver 必需的字符转换器不可用
- mysql宠物销售系统论文,宠物店管理系统的设计与实现.doc