# spring-junit-test
**Repository Path**: jub/spring-junit-test
## Basic Information
- **Project Name**: spring-junit-test
- **Description**: # spring-juint-test spring-juint-test 是一个用于SpringBoot项目单元测试的工具包。适用于微服务项目,针对微服务项目存在大量配置导致启动时间漫长问题,进行懒加载启动服务处理。
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 1
- **Created**: 2021-04-29
- **Last Updated**: 2025-11-09
## Categories & Tags
**Categories**: Uncategorized
**Tags**: SpringBoot单元测试, 分布式项目单元测试, 远程开发环境单元测试
## README
[toc]
# Spring-Junit-Test
## 1、简介
Spring-junit-test 是一个用于SpringBoot项目单元测试的工具包。
#### 产生背景
JUnit和SpringTest,基本上可以满足绝大多数的单元测试了,但是,由于现在的系统越来越复杂,相互之间的依赖越来越多。特别是微服务化以后的系统,往往一个模块的代码需要依赖几个其他模块的东西。因此,在做单元测试的时候,往往很难构造出需要的依赖。
Spring项目在Junit测试,按照IOC的启动方式,需要预先准备好所有的环境,才去执行junit task。在准备环境的这个过程,非常耗时。如果需要连接的中间件越多,则消耗的时间越多,在我们本地执行一下junit task则非常困难。平均每次启动到开始执行task的时间都要5~10分钟。这也导致很多开发人员对junit task的厌恶,拒绝。
一个单元测试,我们只关心一个小的功能。比如我现在只想执行一个任务,这个任务只做了mysql查询,和数据转换。我没有用到redis,没有用到远程服务,没有其他定时器等等。那我执行这一个junit task就没必要去构建与这个task无关的环境准备工作。
Spring-junit-test 插件,就是为了解决这个问题,而产生的。以下是使用Spring-junit-test插件的方式。
比如:
```java
@Runwith(RunSpringJunitTest.class)
public class HttpTest{
@Autowired
private StockHttpService stockHttpService;
@Test
public void stockTest() {
stockHttpService.collectData("");
}
}
```
#### 适用痛点场景
1、远程开发环境,网络环境差
2、分布式项目开发
#### 适用场景
1、业务代码测试
2、分布式场景的业务测试
## 2、使用方式
Spring-Junit-Test的使用方式分为Junit4和Junit5
#### Junit4的使用方式
```java
@Runwith(RunSpringJunitTest.class)
public class HttpTest{
@Autowired
private StockHttpService stockHttpService;
@Test
public void stockTest() {
stockHttpService.collectData("");
}
}
```
#### Junit5的使用方式
```java
@RunSpringJunitTestFor5
public class HttpTest{
@Autowired
private StockHttpService stockHttpService;
@Test
public void stockTest() {
stockHttpService.collectData("");
}
}
```
#### maven 配置
```xml
com.github.jklasd
spring-junit-test-boot-version-controller
2.4.0
com.github.jklasd
spring-junit-test-common
com.github.jklasd
spring-junit-test
2.0.1-SNAPSHOT
```
spring-junit-test-boot-version-controller 是用于对springboot的版本兼容性处理的。
当如果你使用的2.x一下的,则请选择
```xml
com.github.jklasd
spring-junit-test-boot-version-controller
1.5.0
```
#### 对DB的支持方式
##### 为什么要对DB支持?
在我们的现在工作环境中,有可能搭建一个数据环境提供给开发人员,或者自己本地电脑上安装好。这时我们在执行批量以往的单元测试时,有可能会因为重复写入而报错。所以我们希望能够在执行批量单元测试时,保证所有的单元测试不因为数据库的数据固化而印象执行效果。
spring-junit-test 对db的处理支持通过mysql容器和H2两种方式,实现可重复使用的sql和查询数据,方便java单元测试重复执行。
##### 对mysql容器的支持
* 配置初始化语句
```
表结构初始化
src/test/resources/db-mysql/schema/*.sql
跨库表结构初始化【针对某些项目需要跨库查询,可初始化其他库的表结构】
src/test/resources/db-mysql/schema/cross-library/*.sql
表数据初始化
src/test/resources/db-mysql/data/*.sql
```
* @JunitMysqlContainerSelected注解使用
```java
/*
* 放在class上面,全部的method都是用虚拟mysql容器数据库
*/
@JunitMysqlContainerSelected
@RunSpringJunitTestFor5
public class MysqlTest {
@Autowired
private TestService testService;
@Autowired
private TestService2 testService2;
@Test
public void findData() {
testService2.getData("81800000008", 1l);
}
@Test
public void findData2() {
TestData data = testService.getData(2);
System.out.println(data!=null);
System.out.println(data.getTitle());
}
}
```
```java
@RunSpringJunitTestFor5
public class MysqlTest {
@Autowired
private TestService testService;
@Autowired
private TestService2 testService2;
@Test
public void findData() {
testService2.getData("81800000008", 1l);
}
/*
* 放在method上面,指定某个method都是用虚拟mysql容器数据库
*/
@JunitMysqlContainerSelected
@Test
public void findData2() {
TestData data = testService.getData(2);
System.out.println(data!=null);
System.out.println(data.getTitle());
}
}
```
```java
/*
* 放在class上面,全部的method都是用虚拟mysql容器数据库
*/
@JunitMysqlContainerSelected
@RunSpringJunitTestFor5
public class MysqlTest {
@Autowired
private TestService testService;
@Autowired
private TestService2 testService2;
@Test
public void findData() {//这个方法使用虚拟mysql容器数据库
testService2.getData("81800000008", 1l);
}
@JunitMysqlContainerSelected(false)//指定某个method不使用虚拟mysql容器数据库
@Test
public void findData2() {//这个方法使用项目配置application.properties/application.yml配置的数据库
TestData data = testService.getData(2);
System.out.println(data!=null);
System.out.println(data.getTitle());
}
}
```
##### 对H2数据库的支持
* 配置初始化语句
```
表结构初始化
src/test/resources/db-h2/schema/*.sql
跨库表结构初始化【针对某些项目需要跨库查询,可初始化其他库的表结构】
src/test/resources/db-h2/schema/cross-library/*.sql
表数据初始化
src/test/resources/db-h2/data/*.sql
```
* @JunitH2Selected注解使用
```
同@JunitMysqlContainerSelected
```
* @JunitMysqlToH2注解使用【用于替换H2不支持的mysql语句,替换成标准sql】
```java
/*
*由于Mysql 和 H2的兼容性问题
*/
@JunitH2Selected//放在class上面,全部的method都是用H2数据库
@RunSpringJunitTestFor5
public class MysqlTest {
@Autowired
private TestService testService;
@Autowired
private TestService2 testService2;
@Test
@JunitMysqlToH2(from = {"LAST_DAY(DATE_ADD(CURDATE()-DAY(CURDATE())+1,INTERVAL 1 MONTH))",
"DATE_ADD(CURDATE()-DAY(CURDATE())+1,INTERVAL 1 MONTH)"},
to = {"'2022-09-30'","'2022-09-01'"})//用于mysql的特殊函数替换成简单值或者标准sql,针对历史sql处理问题,不修改业务代码。
public void findData() {//这个方法使用H2数据库
testService2.getData("81800000008", 1l);
}
@JunitH2Selected(false)//指定某个method不使用H2数据库
@Test
public void findData2() {//这个方法使用项目配置application.properties/application.yml配置的数据库
TestData data = testService.getData(2);
System.out.println(data!=null);
System.out.println(data.getTitle());
}
}
```