博客地址:http://www.moonxy.com

一、前言

JUnit 是一个由 Java 语言编写的开源的回归测试(回归测试是指重复以前全部或部分的相同测试)框架,由Erich Gamma 和 Kent Beck 创建,用于编写和运行可重复的测试,它是用于单元测试框架体系 xUnit 的一个实例。所谓单元测试也就是白盒测试。JUnit 是 Java 开发使用最为广泛的框架。Spring Boot 在 JUnit 基础上提供了一些实用程序和注解,用来帮助我们测试应用程序。

二、JUnit 测试

2.1 基本功能

JUnit 3.x 版本通过对测试方法的命名(test+方法名)来确定是否是一个测试,且所有的测试类必须继承 TestCase。

JUnit 4.x 版本全面引入了注解来执行我们编写的测试,JUnit 中有两个重要的类(Assume 和 Asset),以及其他一些重要的注解(BeforeClass、AfterClass、After、Before、Test 和 Ignore 等)。其中,BeforeClass 和 AfterClass 在每个类加载的开始和结束时运行,需要设置 static 方法;而 Before 和 After 则在每个测试方法开始之前和结束之后运行;Test 为一个测试用例;Ignore 表示跳过某个测试用例,可以对测试用例选择执行。

package lucene.file.search.tester;

import static org.junit.Assert.assertEquals;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test; public class JunitTest { @BeforeClass
public static void beforeClassTest(){
System.out.println("beforeClassTest start......");
} @Before
public void beforeTest(){
System.out.println("beforeTest start......");
} @Test
public void test1(){
int num1 = 5;
int num2 = 6;
System.out.println("test1");
assertEquals("equals or not :",1,num2-num1);
} @Test
public void test2(){
int num1 = 5;
int num2 = 8;
System.out.println("test2");
assertEquals("equals or not :",2,num2-num1);
} @After
public void afterTest(){
System.out.println("afterTest start......");
} @AfterClass
public static void afterClassTest(){
System.out.println("afterClassTest start......");
}
}

运行结果如下:

控制台 Console 输出为:

beforeClassTest start......
beforeTest start......
test1
afterTest start......
beforeTest start......
test2
afterTest start......
afterClassTest start......

JUnit 测试结果展示为:

2.2 Assert

上面代码中,我们使用了JUnit 的 Assert 类提供的 assert 方法,我们可以在测试类中静态地导入这些方法,主要包括:

assertEquals("message",A,B),判断 A 对象和 B 对象是否相等,这个判断在比较两个对象时调用了 equals() 方法;

assertSame("message",A,B),判断 A 对象与 B 对象是否相同,之前的 assert 方法是检查 A 与 B 是否有相同的值(使用了 equals 方法),而 assertSame 方法则是检查 A 与 B 是否为同一个对象(使用的是 == 操作符);

assertTrue("message",A),判断 A 条件是否为真;

assertFalse("message",A),判断 A 条件是否为假;

assertNotNull("message",A),判断 A 条件是否不为 Null;

assertArrayEquals("message",A),判断 A 数组与 B 数组是否相等。

2.3 Suite

JUnit 设计 Suite 的目的是一次性运行一个或多个测试用例,Suite 是一个容器,用来把几个测试类归在一起,并把它们作为一个集合来运行,测试运行器会启动 Suite,而运行哪个测试类由 Suite 决定。如下:

package lucene.file.search.tester;

import org.junit.runner.RunWith;
import org.junit.runners.Suite; @RunWith(Suite.class)
@SuiteClasses({TestSuite1.class, TestSuite2.class})
public class JunitTest {
// 此类为空,但依然可以运行JUnit测试,运行时,它会将TestSuite1.class和TestSuite2.class中的所有测试用例都执行一遍
}

三、Spring Boot 单元测试

Spring Boot 使用一系列注解来增强单元测试以支持 Spring Boot 测试。通常 Spring Boot 单元测试结构如下:

@RunWith(SpringRunner.class)
@SpringBootTest(classes=SpringbootApplication.class)
public class UserRepositoryTest { @Autowired
private UserService userService; @Test
public void testService() {
// 测试内容
} }

其中,@RunWith 是 JUnit 标准的一个注解,用来告诉 JUnit 单元测试框架不要使用内置的方式进行单元测试,而应使用 RunWith 指明的类来提供单元测试,所有的 Spring 单元测试总是使用 SpringRunner.class。

@SpringBootTest 用于 Spring Boot 应用测试,它默认会根据包名逐级网上找,当测试类和主程序在同一个包下时,可以不用配置 classes,Spring 会一直找到 Spring Boot 主程序,也就是通过类注解是否包含@SpringBootApplication 来判断是否是主程序,并在单元测试的时候启动该类来创建 Spring 上下文环境。但当测试类和主程序不在同一个包下时,需要添加 classes,指定主程序启动类,如 classes=SpringbootApplication.class。

具体测试用例可以参考本博客的文章:Spring Boot 入门之持久层篇(三)

注意:Spring 单元测试并不会在每个单元测试方法前都启动一个全新的 Spring 上下文,因为这样太耗时。Spring 单元测试会缓存上下文环境,以提供给每个单元测试方法。如果某个单元测试方法改变了上下文,比如更改了 Bean 定义,你需要在此单元测试方法上加上 @DirtiesContext 以提示 Spring 重新加载 Spring 上下文。

Spring Boot 入门之单元测试篇(五)的更多相关文章

  1. Spring Boot 入门之消息中间件篇(五)

    原文地址:Spring Boot 入门之消息中间件篇(五) 博客地址:http://www.extlight.com 一.前言 在消息中间件中有 2 个重要的概念:消息代理和目的地.当消息发送者发送消 ...

  2. Spring Boot 入门之基础篇(一)

    原文地址:Spring Boot 入门之基础篇(一) 博客地址:http://www.extlight.com 一.前言 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是 ...

  3. Spring Boot 入门之 Web 篇(二)

    原文地址:Spring Boot 入门之 Web 篇(二) 博客地址:http://www.extlight.com 一.前言 上一篇<Spring Boot 入门之基础篇(一)>介绍了 ...

  4. Spring Boot 入门之消息中间件篇(转发)

    一.前言 在消息中间件中有 2 个重要的概念:消息代理和目的地.当消息发送者发送消息后,消息就被消息代理接管,消息代理保证消息传递到指定目的地. 我们常用的消息代理有 JMS 和 AMQP 规范.对应 ...

  5. Spring Boot 入门之 Cache 篇(四)

    博客地址:http://www.moonxy.com 一.前言 Spring Cache 对 Cahce 进行了抽象,提供了 @Cacheable.@CachePut.@CacheEvict 等注解. ...

  6. Spring Boot入门系列(十五)Spring Boot 开发环境热部署

    在实际的项目开发过中,当我们修改了某个java类文件时,需要手动重新编译.然后重新启动程序的,整个过程比较麻烦,特别是项目启动慢的时候,更是影响开发效率.其实Spring Boot的项目碰到这种情况, ...

  7. Spring Boot 入门之持久层篇(三)

    原文地址:Spring Boot 入门之持久层篇(三) 博客地址:http://www.extlight.com 一.前言 上一篇<Spring Boot 入门之 Web 篇(二)>介绍了 ...

  8. spring boot入门教程——Spring Boot快速入门指南

    Spring Boot已成为当今最流行的微服务开发框架,本文是如何使用Spring Boot快速开始Web微服务开发的指南,我们将使创建一个可运行的包含内嵌Web容器(默认使用的是Tomcat)的可运 ...

  9. Spring boot学习1 构建微服务:Spring boot 入门篇

    Spring boot学习1 构建微服务:Spring boot 入门篇 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框 ...

随机推荐

  1. RuntimeError: one of the variables needed for gradient computation has been modified by an inplace

    vgg里面的 ReLU默认的参数inplace=True 当我们调用vgg结构的时候注意 要将inplace改成 False 不然会报错 RuntimeError: one of the variab ...

  2. 性能测试学习第七天-----JMeter之linux环境部署篇

    一.linux获取动态ip或静态ip: 1. virtualbox 加载linux虚拟机镜像文件,加载时重置全部网卡,加载后网络选择“桥接网络”--本机当前使用网卡: 2. ifconfig      ...

  3. shiro登录名的获取

    登录名的获取:通过的SecurityUtils的shiro import org.apache.shiro.SecurityUtils; //登录用户名 String loginAccount = S ...

  4. C#数据结构_基本概念及线性表

    常见的4类数据结构: 1.集合. 2.线性结构.3.树形结构.4.图状结构. 数据结构(Data Structure)简记为 DS,是一个二元组,DS = (D,R) 其中:D 是数据元素的有限集合, ...

  5. Spring框架之事务管理

    Spring框架之事务管理 一.事务的作用 将若干的数据库操作作为一个整体控制,一起成功或一起失败. 原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生. 一致性:指事务前后 ...

  6. 百度地图Canvas实现十万CAD数据秒级加载

    背景 前段时间工作室接到一个与地图相关的项目,我作为项目组成员主要负责地图方面的设计和开发.由于地图部分主要涉及的是前端页面的显示,作为一名Java后端的小白,第一次写了这么多HTML和JavaScr ...

  7. PythonWeb框架Django:虚拟环境安装(virtualenv)

    虚拟环境的用处: 当我们有多个项目要使用不同的第三方类库的时候,就会发生冲突,因为Python的环境内只允许一个版本的第三方类库. 比如说 有A,B两个Web项目,但是A项目的Django的环境为2. ...

  8. Nginx总结(四)基于域名的虚拟主机配置

    前面讲了如何安装配置Nginx,大家可以去这里看看nginx系列文章:https://www.cnblogs.com/zhangweizhong/category/1529997.html 今天要说的 ...

  9. 《阿里巴巴Java开发手册1.4.0》阅读总结与心得(二)

    (六)并发处理 12. [推荐] 在并发场景下, 通过双重检查锁(double-checked locking) 实现延迟初始化的优化问题隐患(可参考 The "Double-Checked ...

  10. 自制轮子 canvas tree

    这是树的效果 这个树拥有的功能有 1.小地图显示 2.小地图点击快速定位 3.点击加减显示根节点 4.基本的数显示 5.节点拖拽 6.点击头像跳转到相关页面 7.使用直角线和直线选择 8.画布自适应 ...