一文教会你如何在 Spring 中进行集成测试,太赞了
不得不说,测试真的是太重要了!但并不是所有的开发者都这样认为,这种感觉在我回到洛阳后尤其强烈。竟然有团队成员不经测试就把代码提交到代码库,并且是会报错的那种,我天呐,遇到这种队友我也是醉了。
我之前是在一家日企工作,他们非常注重测试,占用的时间比代码编写的时间多多了。从单元测试到集成测试,所有的测试结果都要整理成文档保存下来,哪怕你觉得完全没有必要。但正是这种一丝不苟的态度,成就了日企软件高质量的美誉。
单元测试通常比较简单,对运行环境的依赖性不强。但集成测试就完全不同了,需要整个项目是能够跑起来的,比如说需要数据库是连接的,网络是通畅的等等。
集成测试最简单的形式是:把两个已经测试过的单元组合成一个组件,测试它们之间的接口。从这一层意义上讲,组件是指多个单元的集成聚合。在现实方案中,许多单元组合成组件,而这些组件又聚合为程序的更大部分。方法是测试片段的组合,并最终扩展成进程,将模块与其他组的模块一起测试。最后,将构成进程的所有模块一起测试。
Spring 提供了 Spring TestContex Framework 来支持集成测试,它不依赖于特定的测试框架,因此你可以选择 Junit,也可以选择 TestNG。本文选择 Junit,因此需要先将 Junit 和 Spring TestContex Framework 的依赖添加到 pom.xml 文件中。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.2.RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
准备工作完成后,来考虑这样一个场景,我们需要同时为开发环境和生产环境维护数据源配置,因此我们先创建一个公共的接口 Datasource,内容如下所示:
public interface Datasource {
public void setup();
}
新建 DevDatasource 类,实现 Datasource 接口,该类用于为开发环境配置数据源,内容如下:
@Component
@Profile("dev")
public class DevDatasource implements Datasource {
@Override
public void setup() {
System.out.println("开发环境");
}
}
@Component
注解用于为 Spring 容器注入一个通用的 Bean 组件。@Profile
注解用于标识不同环境下要实例化的 Bean,字符串“dev” 表示该组件用于开发环境。
新建 ProdDatasource 类,实现 Datasource 接口,该类用于为正式运行环境配置数据源,内容如下:
@Component
@Profile("prod")
public class ProdDatasource implements Datasource {
@Override
public void setup() {
System.out.println("正式环境");
}
}
新建配置类 SpringTestConfig,内容如下:
@Configuration
@ComponentScan("test")
public class SpringTestConfig {
}
@Configuration
注解表示当前类为一个配置类,@ComponentScan
注解用于指定扫描路径,该路径下的 Bean 将会自动装配到 Spring 容器中。
基于 Maven 构建的项目默认有两个测试目录,src/test/java 和 src/test/resources,分别对应于 src/main/java 和 src/main/resources。前者用于测试项目源码,后者用于测试项目资源。
我们在 src/test/java
目录下新建测试类 DevTest,内容如下:
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles("dev")
@ContextConfiguration(classes = { SpringTestConfig.class })
public class DevTest {
@Autowired
Datasource datasource;
@Test
public void testSpringProfiles() {
Assert.assertTrue(datasource instanceof DevDatasource);
}
}
1)@RunWith
注解用于指定 Junit 运行环境,是 Junit 提供给其他框架测试环境的接口扩展,Spring 提供了 org.springframework.test.context.junit4.SpringJUnit4ClassRunner
作为 Junit 测试环境。
2)@ActiveProfile
注解用于指定哪个配置文件处于活动状态,本例为开发环境“dev”。
3)@ContextConfiguration
注解用于指定配置类,本例为 SpringTestConfig 类。
4)@Autowired
注解用于指定 Spring 要自动装配的 Bean。
5)@Test
注解用于表示当前方法为 Junit 测试方法。
程序运行的结果如下图所示:
再新建一个测试类 ProdTest,内容如下:
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles("prod")
@ContextConfiguration(classes = { SpringTestConfig.class })
public class ProdTest {
@Autowired
Datasource datasource;
@Autowired
Environment environment;
@Test
public void testSpringProfiles() {
for (String profileName : environment.getActiveProfiles()) {
System.out.println("当前激活的 profile - " + profileName);
}
Assert.assertTrue(datasource instanceof ProdDatasource);
}
}
这次使用 @ActiveProfiles("prod")
注解指定当前环境为正式运行下的环境。本例中我们装配了一个新的 Bean environment,使用它的 getActiveProfiles()
方法可以获取当前激活的 Profile。程序运行的结果如下图所示:
好了,我亲爱的读者朋友,以上就是本文的全部内容了,是不是感觉在 Spring 中进行集成测试还是挺简单的?如果觉得文章对你有点帮助,请微信搜索「 沉默王二 」第一时间阅读。示例代码已经上传到 GitHub,传送门~
我是沉默王二,一枚有趣的程序员。原创不易,莫要白票,请你为本文点个赞吧,这将是我写作更多优质文章的最强动力。
一文教会你如何在 Spring 中进行集成测试,太赞了的更多相关文章
- 6.1 如何在spring中自定义xml标签
dubbo自定义了很多xml标签,例如<dubbo:application>,那么这些自定义标签是怎么与spring结合起来的呢?我们先看一个简单的例子. 一 编写模型类 package ...
- 如何在spring中运行多个schedulers quartz 实例
http://wzping.iteye.com/blog/468263 1.定义一个JOB <!-- 使用pojo来做job,指定pojo和method --> <bean ...
- 如何在 spring 中启动注解装配?
默认情况下,Spring 容器中未打开注解装配.因此,要使用基于注解装配,我们 必须通过配置 <context:annotation-config/> 元素在 Spring 配置文件 中启 ...
- 如何在spring中获取request对象
1.通过注解获取(很简单,推荐): public class Hello {@Autowired HttpServletRequest request; //这里可以获取到request} 2.在w ...
- (转)Spring中@Async用法总结
原文:http://blog.csdn.net/blueheart20/article/details/44648667 引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的: ...
- Spring中@Async用法总结
引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring 3. ...
- 玩转Spring MVC(五)----在spring中整合log4j
在前边的基础上,本文主要总结一下如何在spring 中配置log4j,在本文末尾会给出完整项目的链接. 首先是web.xml中要新添加的代码: <!-- 6. 配置log4j --> &l ...
- Spring中@Async
在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring 3.x之后, ...
- Spring中的@Async
在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring 3.x之后, ...
随机推荐
- JS如何进行对象的深克隆(深拷贝)?
JS中,一般的赋值传递的都是对象/数组的引用,并没有真正的深拷贝一个对象,如何进行对象的深拷贝呢? var a = {name : 'miay'}; var b = a; b.name = 'Jone ...
- 01 搭建EasyMock环境
EasyMock 介绍 EasyMock是一个构建模拟数据的平台,也可以说是一个在线mockJs平台 EasyMock优势 省去配置.安装mockJs步骤,解决多人协作Mock数据不互通问题 不需要在 ...
- IoT设备实践丨如果你也在树莓派上部署了k3s,你也许需要这篇文章
前 言 树莓派是一种广泛流行的开发板,随着物联网的深入发展,树莓派大有成为IoT终端设备标准之趋势.在支持客户在IoT场景中落地k3s时,k3s在树莓派上的部署问题也就出现了.本文记录了一些其中的关键 ...
- MySQL 统计行数的 count
MySQL count() 函数我们并不陌生,用来统计每张表的函数.但如果你的表越来越大,并且是 InnoDB 引擎的话,会发现计算的速度会越来越慢.在这篇文章里,会先介绍 count() 实现的原理 ...
- express模块中的req,res参数的常用属性方法
express模块中的req,res参数的常用属性方法 const express = require('express'); const router = express.Router() rout ...
- 微信公众号 H5页面 支付注意细节
1. 当秘钥(AppSecretApplets) 有问题时注意是不是已经被重置过了,此时要注意获取最新的秘钥: 2. 调试时后端的东西要放在线上https 请求 不然在手机上测试时 会被拦截: ...
- Java多线程并发02——线程的生命周期与常用方法,你都掌握了吗
在上一章,为大家介绍了线程的一些基础知识,线程的创建与终止.本期将为各位带来线程的生命周期与常用方法.关注我的公众号「Java面典」了解更多 Java 相关知识点. 线程生命周期 一个线程不是被创建了 ...
- Python文本文件读写操作时的字符编码问题
说明:文本文件的字符编码问题只存在t模式中,如:open('a.txt', mode='rt') 编码(encode): 我们输入的任何字符想要以文件(如.txt)的形式保存在计算机的硬盘上, 必须先 ...
- Java基础 - 数据类型和运算符
Java 语言支持的类型分为两类:基本数据类型(Primitive Type)和引用类型(Reference Type). 目录 基本数据类型 数值类型 整数类型 byte short int lon ...
- hdu1908 逆序对
题目链接:https://www.luogu.com.cn/problem/P1908 这个题不要以为拿到手就可以树状数组秒,本题的数据范围是1e9显然简单的树状数组是空间不够的,点个数有5e5,所以 ...