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 测试基类

为了与DaoService分开所以 Controller层单写一个基类,跟当前阶段无关的能不加载就省一下。

  1. @RunWith(SpringJUnit4ClassRunner.class):照规矩写上即可。
  2. @WebAppConfiguration:加载web上下文WebApplicationContext,测controller层必须地。。。
  3. @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

  1. 选中 PoemController.java
  2. 点击热键 Ctrl + N
  3. 注意:
    1、就测试文件放置的位置。
    2、是让此单元测试继承:测试基类ControllerBaseTest
  4. 选择要测试的方法

IDEA

在要被测试的 xxxController.java文件中:

  1. 右键 Generate 或直接热键: Alt + Insert
  2. 选择 Test...
  3. 创建测试类

    1. 选择Junit 版本
    2. 测试类名称(通常就是原类加上Test结尾)
    3. 测试类的父类:一般我们把一些基础配置写在父类,然后测试类直接继承即可。
    4. 测试类包名:与原类保持一致即可。
    5. 测试前后要执行的一些操作,能在父类统一写好的尽量在父类写。
    6. 选择要创建单元测试的方法。

/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 测试相关推荐

  1. junit4 单元测试框架_超越JUnit –测试框架的替代方案

    junit4 单元测试框架 JUnit是事实上的Java单元测试框架,但是可能有一些新的(不是那么新的)框架可以用于Web开发. 在采用之前可能要问自己的问题: 它们是否快速,容易开发并因此成本低廉? ...

  2. IDEA中Maven项目使用Junit4单元测试的写法

    IDEA默认是安装了junit控件的,直接使用就好了 在maven项目的pom.xml文件中添加依赖 <dependency><groupId>junit</groupI ...

  3. JUnit4 单元测试框架

    序言 刚学Java的时候就听说过JUnit了,单元测试框架,很好用的测试框架,JUnit测试框架将测试更加便捷和容易,编写测试代码也是简单.明了,功能强大.今天给大家简单分享一下最新JUnit4的使用 ...

  4. JUnit4单元测试

    我们在编写大型程序的时候,需要写成千上万个方法或函数,这些函数的功能可能很强大,但我们在程序中只用到该函数的一小部分功能,并且经过调试可以确定,这一小部分功能是正确的.但是,我们同时应该确保每一个函数 ...

  5. Scala使用JUnit4单元测试

    Scala使用JUnit4单元测试 Maven pom: <dependency><groupId>junit</groupId><artifactId> ...

  6. 使用Spring+Junit4.4进行测试

    http://nottiansyf.iteye.com/blog/345819 使用Junit4.4测试  在类上的配置Annotation  @RunWith(SpringJUnit4ClassRu ...

  7. 如何在单元测试中测试异步函数,block回调这种

    大概有四种方法: runloop 阻塞主进程等待结果 semphaore 阻塞主进程等待结果 使用XCTestExpectation 阻塞主线程等待(我用这个,xcode自带的,为啥不用) 使用第三方 ...

  8. 单元测试怎么测试线程_单元测试线程代码的5个技巧

    单元测试怎么测试线程 以下是一些技巧,说明如何进行代码的逻辑正确性测试(与多线程正确性相对). 我发现本质上有两种带有线程代码的刻板印象模式: 面向任务-许多短期运行的同类任务,通常在Java 5执行 ...

  9. VS2015+NUnit+OpenCover 完成单元测试代码覆盖率测试

    1.VS2015+NUnit+OpenCover 完成单元测试代码覆盖率测试 https://download.csdn.net/download/qq_39441918/10522539 2.*注意 ...

  10. tSQLt单元测试的测试驱动数据库开发(TDDD)基础

    This article talks about core concepts of test-driven database development followed by creating simp ...

最新文章

  1. NSArray与NSString、NSData,NSDictionary与NSString、NSData 相互转化
  2. 设计模式 — 行为型模式 — 解释器模式
  3. Java中static的作用
  4. iOS----------iPhone导出手机所有短信
  5. windows系统下 VUE cli手脚架环境安装
  6. SAP Spartacus 从 Ngrx 里获取 navigation 的实时状态
  7. Emmet:HTML/CSS代码快速编写神器
  8. 基于 MyBatis 手撸一个分表插件
  9. iPhone11翻车了?发烫严重、信号依旧差...
  10. mysql不支持emoji表情的问题的解决方法
  11. Linux 文件权限、用户权限和用户组管理vim的一些基本使用技巧
  12. 12306网上买火车票怎么选择上中下铺
  13. 两根硬铜线并线接插座_两根硬铜线正确接法
  14. Odoo的采购入库单、销售发货单整单被取消,或选择了不生成欠单后又想继续入库或发货,如何处理?
  15. 优秀的程序员是没有性生活的
  16. 智能测试实践之路-UI 缺陷检测
  17. java迷宫鼠_C++ 迷宫算法(迷宫老鼠)
  18. 中国历史和世界史横向对照表,收藏了长知识。 ​​​​
  19. MATLAB 打不开coder,MATLAB CODER初次使用的错误提示,希望大侠可以帮忙解决!...
  20. OpenGL 动画的制作

热门文章

  1. Android编码规范
  2. 机器学习(6): 决策树算法 小结与实验
  3. conan入门(六):conanfile.txt conanfile.py的区别
  4. 基于JAVA超市自助购物系统的设计与实现
  5. python群聊机器人_基于python-wechaty的群聊助手机器人
  6. ctfmon是什么启动项_win7启动项没有ctfmon.exe的解决方法
  7. 数据中心建筑及装修施工工序工艺管理要点
  8. iPhone5捣鼓mobile terminal
  9. DB2 JDBC Driver 必需的字符转换器不可用
  10. mysql宠物销售系统论文,宠物店管理系统的设计与实现.doc