准备工作

springboot使用单元测试需要先引入以下依赖

  <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>

test依赖会引入如下的jar包

service单元测试

springboot中单元测试类写在src/test/java目录下,可以进行手动创建测试类,或者通过idea自动创建测试类ctrl+shift+T(shift+command+T)或者菜单栏鼠标点击创建:

上面就是最简单的单元测试写法,想要执行的时候,鼠标放在对应的方法,右键选择run该方法即可。

controller单元测试

对controller进行单元测试时,需要使用到MockMvc了。这样就可以不必启动项目就可以测试这些接口了。
MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便。
示例代码如下:

package com.test.danyuanceshi.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;/*** 单元测试联系示例使用到的controller*/
@RestController
public class DanYuanCeShiController {@GetMapping("/get/not/param")public String testDanYanControllerNotParam(){return "没有请求参数的单元测试get方法";}}
package com.test.danyuanceshi.controller;import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;@SpringBootTest
@RunWith(SpringRunner.class)
public class DanYuanCeShiControllerTest {@Autowiredprivate WebApplicationContext webApplicationContext;private MockMvc mockMvc;@Beforepublic void setUp() throws Exception{//初始化mockMvc对象//指定webApplicationContext上下文,将会从这个上下文获取对应的控制器并得到相应的mockMvcSystem.out.println("----初始化mockMvc-----");mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();System.out.println("----mockMvc执行完毕------");}@Beforepublic void before() {System.out.println("@Before");}@Testpublic void testDanYanControllerNotParam() throws Exception {MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/get/not/param").accept(MediaType.TEXT_HTML_VALUE).contentType(MediaType.APPLICATION_JSON_UTF8)).andDo(MockMvcResultHandlers.print()).andReturn();int status = mvcResult.getResponse().getStatus();String content = mvcResult.getResponse().getContentAsString();Assert.assertEquals(200, status);
//        Assert.assertEquals("nice", content);System.out.println("测试before");}/*@BeforeClasspublic static void beforeClass() {System.out.println("BeforeClass");};*/
}

SpringBoot引入MockMvc

  1. 什么是Mock?
    在面向对象的程序设计中,模拟对象(mock object)是以可控的方式模拟真实对象行为的假对象。在编程过程中,通常通过模拟一些输入数据,来验证程序是否达到预期结果。
  2. 为什么使用Mock对象
    使用模拟对象,可以模拟复杂的、真实的对象行为。如果在单元测试中无法使用真实对象,可采用模拟对象进行替代。
  3. MockMvc的概念
    MockMvc是由spring-test包提供,实现了对http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,使得测试速度快、不依赖网络环境。同时提供了一套验证的工具,结果的验证十分方便。
    接口MockMvcBuilder,提供一个唯一的build方法,用来构造MockMvc。主要有两个实现StandaloneMockMvcBuilder和DefaultMockMvcBuilder。
  4. MockMvc的基本步骤
    (1)mockMvc.perform执行一个请求
    (2)MockMvcRequestBuilders.get(“xxx”)构造一个请求
    (3)ResultActions.param添加请求传值
    (4)ResultActions.accept()设置返回类型
    (5)ResultActions.addExpect添加执行完成后的断言
    (6)ResultActions.andDo添加一个结果处理器,表示要对结果做的事情,例如使用print()输出相应信息
    (7)ResultActions.andReturn 表示执行完成后返回相应的结果

注解解释

  1. @SpringBootTest:获取启动类,加载配置,寻找主配置启动类(@SpringBootApplication注解的)
  2. @RunWith(SpringRunner.class):让JUnit运行Spring的测试环境,获取Spring环境的上下文支持
  3. @AutoConfigureMockMvc:用于自动配置MockMvc,配置后MockMvc类可以直接注入,相当于new MockMvc
  4. @Before:初始化方法,对于每一个测试方法都要执行一次。
    断言的概念
  5. 断言(assert),编程术语,表示为一些布尔表达式,在程序中的某个特定点该表达式值为真。可以在任何时候启用或者禁用断言验证。因此可以在测试时启用断言而在部署的时候禁用断言
  6. 断言用来判断一个函数或者对象的一个方法所产生的结果是否符合期望的值

assertThat使用

JUnit 4.4 结合 Hamcrest 提供了一个全新的断言语法——assertThat。可以只使用 assertThat 一个断言语句,结合 Hamcrest 提供的匹配符,就可以表达全部的测试思想。
assertThat的优点:

  1. 以前 JUnit 提供了很多的 assertion 语句,如:assertEquals,assertNotSame,assertFalse,assertTrue,assertNotNull,assertNull 等,现在有了 JUnit 4.4,一条 assertThat 即可以替代所有的 assertion 语句,这样可以在所有的单元测试中只使用一个断言方法,使得编写测试用例变得简单,代码风格变得统一,测试代码也更容易维护。
  2. assertThat 使用了 Hamcrest 的 Matcher 匹配符,用户可以使用匹配符规定的匹配准则精确的指定一些想设定满足的条件,具有很强的易读性,而且使用起来更加灵活。
  3. assertThat 不再像 assertEquals 那样,使用比较难懂的“谓宾主”语法模式(如:assertEquals(3, x);),相反,assertThat 使用了类似于“主谓宾”的易读语法模式(如:assertThat(x,is(3));),使得代码更加直观、易读。

基本语法:
assertThat( [value], [matcher statement] );
value :接下来想要测试的变量值; matcher statement :使用 Hamcrest 匹配符来表达的对前面变量所期望的值的声明,如果 value 值与 matcher statement 所表达的期望值相符,则测试成功,否则测试失败。

java基础之单元测试相关推荐

  1. (60)Java基础 --单元测试

    目录 一.测试的概念 二.使用Junit4.x进行单元环境 1.环境搭建 2.使用步骤 3.常见注解 三.规范的Junit测试方式 四.断言 1.为什么要使用断言 2.什么是断言(猜测) 3.常用AP ...

  2. Java基础单元测试

    本篇博文目录: 1.单元测试 (1) 测试Java方法(原生) 2. JUnit 5 (1) JUnit 5简单使用的例子 (2) JUnit5常用注解 (3) JUnit5常用注解的使用 (4).J ...

  3. Java基础-SSM之mybatis快速入门篇

    Java基础-SSM之mybatis快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 其实你可能会问什么是SSM,简单的说就是spring mvc + Spring + m ...

  4. [转载] Java基础知识面试题(2020最新版)

    参考链接: Java中的异常类型与示例 文章目录 Java概述何为编程什么是Javajdk1.5之后的三大版本JVM.JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码? ...

  5. Java基础 (适合新手入门保姆级)

    基础1 1.进制的转换 1. 十进制数据转成二进制数据:使用除以2获取余数的方式 2. 二进制(0B/b开头)转换为十进制:1001 = 1*2^0+0*2^1+0*2^2 +1*2^3 = 9 3. ...

  6. Java基础知识面试题(2021最新版)

    转载自:https://thinkwon.blog.csdn.net/article/details/104390612 文章目录 Java概述 何为编程 什么是Java jdk1.5之后的三大版本 ...

  7. java基础总结-java技术栈快速复习

    java基础 java基础概念 java概述和语言背景 java语言是没有sun公司(Stanford University Network:斯坦福大学网络)在1995年推出的计算机语言 java之父 ...

  8. Java 基础入门,小白提升路线图

    1000+最新Java面试题 获取学习路线资料啦 Java的基础知识就像我们所住的房子的地基,如果地基不稳,上面所盖的楼房再宏伟,也是没人敢去入住的,同理Java的基础不牢固,以后也很难成为真正意义上 ...

  9. Java基础知识点总结(面试版)

    目录 基础篇 4 一.JDK常用的包 4 二. Get和Post的区别 4 三. Java多态的具体体现 4 四. StringBuffer StringBuilder String 区别 5 五. ...

最新文章

  1. scanf_s写入错误怎么办?(字符串需要sizeof()参数指定接收长度)附示例
  2. 【转】WSS3.0开发--你还在为写CAML痛苦吗?
  3. VTK:图片之Flip
  4. 广播网关GPC为MDS多媒体调度再添虎翼
  5. 的内怎么放_放了心脏支架能活多久?医生坦言:做到三件事,才能和正常人一样...
  6. C语言逗号表达式 - C语言零基础入门教程
  7. BugkuCTF-MISC题红绿灯
  8. 深入沟通的重要性——《大道至简》第四章读后感
  9. 12月12日习题答案大剖析!再接再厉
  10. java获取cpu核数_vn.py社区精选12 - 策略参数优化,你需要懂得压榨CPU!
  11. 客服系统微服务架构的演化
  12. android 软件apk自动更新实现注意点!!
  13. java64位1.8.0下载_jdk1.8下载 64位
  14. 使用 busybox 为 龙芯2f 创建 文件系统
  15. e会学c语言程序设计基础网课答案,C程序设计(双语版)习题答案
  16. C++ 条件运算符 (?:)
  17. 无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\tsc.ps1,是指在此系统上禁止运行脚本
  18. xml的三种解析方式
  19. Instruction set mismatch
  20. datasets数据集

热门文章

  1. php怎么使用艺术字,我是怎样用Word在图片上写艺术字的
  2. android glide不缓存,Glide中的缓存
  3. Python 修改pip缓存目录
  4. 蓝桥 穿越雷区【第六届】【决赛】【C组】 BFS模板题 python
  5. 【MySQL系统学习专栏】- 数据库操作
  6. 无损以太网与网络拥塞管理(PFC、ECN)
  7. 171CMS开源应用市场建站系统,包括 PC站+WAP站+APP原生客户端三站合一
  8. spring定时器 cron表达式
  9. 25个Web开发中的移动端响应式菜单练习案例
  10. wireshark抓包红色_Wireshark网络抓包(一)——数据包、着色规则和提示