Commit c64bb81caeee2721e0c373eee014e3977d88cb37

Authored by YunaiV
1 parent 10ba70e1

解决 spring.sql.init.schema-locations 不自动初始化,通过自定义的 SqlInitializationTestConfiguration 实现

yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/test/RedisTestConfiguration.java renamed to yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/config/RedisTestConfiguration.java
1 -package cn.iocoder.yudao.module.system.test; 1 +package cn.iocoder.yudao.framework.test.config;
2 2
3 import com.github.fppt.jedismock.RedisServer; 3 import com.github.fppt.jedismock.RedisServer;
4 import org.springframework.boot.autoconfigure.data.redis.RedisProperties; 4 import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
@@ -9,6 +9,11 @@ import org.springframework.context.annotation.Lazy; @@ -9,6 +9,11 @@ import org.springframework.context.annotation.Lazy;
9 9
10 import java.io.IOException; 10 import java.io.IOException;
11 11
  12 +/**
  13 + * Redis 测试 Configuration,主要实现内嵌 Redis 的启动
  14 + *
  15 + * @author 芋道源码
  16 + */
12 @Configuration(proxyBeanMethods = false) 17 @Configuration(proxyBeanMethods = false)
13 @Lazy(false) // 禁止延迟加载 18 @Lazy(false) // 禁止延迟加载
14 @EnableConfigurationProperties(RedisProperties.class) 19 @EnableConfigurationProperties(RedisProperties.class)
@@ -20,7 +25,7 @@ public class RedisTestConfiguration { @@ -20,7 +25,7 @@ public class RedisTestConfiguration {
20 @Bean 25 @Bean
21 public RedisServer redisServer(RedisProperties properties) throws IOException { 26 public RedisServer redisServer(RedisProperties properties) throws IOException {
22 RedisServer redisServer = new RedisServer(properties.getPort()); 27 RedisServer redisServer = new RedisServer(properties.getPort());
23 - // TODO 芋艿:一次执行多个单元测试时,貌似创建多个 spring 容器,导致不进行 stop。这样,就导致端口被占用,无法启动。。。 28 + // 一次执行多个单元测试时,貌似创建多个 spring 容器,导致不进行 stop。这样,就导致端口被占用,无法启动。。。
24 try { 29 try {
25 redisServer.start(); 30 redisServer.start();
26 } catch (Exception ignore) {} 31 } catch (Exception ignore) {}
yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/config/SqlInitializationTestConfiguration.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.test.config;
  2 +
  3 +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
  4 +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
  5 +import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
  6 +import org.springframework.boot.autoconfigure.sql.init.SqlInitializationProperties;
  7 +import org.springframework.boot.context.properties.EnableConfigurationProperties;
  8 +import org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer;
  9 +import org.springframework.boot.sql.init.AbstractScriptDatabaseInitializer;
  10 +import org.springframework.boot.sql.init.DatabaseInitializationSettings;
  11 +import org.springframework.context.annotation.Bean;
  12 +import org.springframework.context.annotation.Configuration;
  13 +import org.springframework.context.annotation.Lazy;
  14 +
  15 +import javax.sql.DataSource;
  16 +
  17 +/**
  18 + * SQL 初始化的测试 Configuration
  19 + *
  20 + * 为什么不使用 org.springframework.boot.autoconfigure.sql.init.DataSourceInitializationConfiguration 呢?
  21 + * 因为我们在单元测试会使用 spring.main.lazy-initialization 为 true,开启延迟加载。此时,会导致 DataSourceInitializationConfiguration 初始化
  22 + * 不过呢,当前类的实现代码,基本是复制 DataSourceInitializationConfiguration 的哈!
  23 + *
  24 + * @author 芋道源码
  25 + */
  26 +@Configuration(proxyBeanMethods = false)
  27 +@ConditionalOnMissingBean(AbstractScriptDatabaseInitializer.class)
  28 +@ConditionalOnSingleCandidate(DataSource.class)
  29 +@ConditionalOnClass(name = "org.springframework.jdbc.datasource.init.DatabasePopulator")
  30 +@Lazy(value = false) // 禁止延迟加载
  31 +@EnableConfigurationProperties(SqlInitializationProperties.class)
  32 +public class SqlInitializationTestConfiguration {
  33 +
  34 + @Bean
  35 + public DataSourceScriptDatabaseInitializer dataSourceScriptDatabaseInitializer(DataSource dataSource,
  36 + SqlInitializationProperties initializationProperties) {
  37 + DatabaseInitializationSettings settings = createFrom(initializationProperties);
  38 + return new DataSourceScriptDatabaseInitializer(dataSource, settings);
  39 + }
  40 +
  41 + static DatabaseInitializationSettings createFrom(SqlInitializationProperties properties) {
  42 + DatabaseInitializationSettings settings = new DatabaseInitializationSettings();
  43 + settings.setSchemaLocations(properties.getSchemaLocations());
  44 + settings.setDataLocations(properties.getDataLocations());
  45 + settings.setContinueOnError(properties.isContinueOnError());
  46 + settings.setSeparator(properties.getSeparator());
  47 + settings.setEncoding(properties.getEncoding());
  48 + settings.setMode(properties.getMode());
  49 + return settings;
  50 + }
  51 +
  52 +}
yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/test/BaseDbAndRedisUnitTest.java
@@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.system.test; @@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.system.test;
3 import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; 3 import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration;
4 import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; 4 import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration;
5 import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; 5 import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration;
  6 +import cn.iocoder.yudao.framework.test.config.RedisTestConfiguration;
  7 +import cn.iocoder.yudao.framework.test.config.SqlInitializationTestConfiguration;
6 import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; 8 import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
7 import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; 9 import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
8 import org.redisson.spring.starter.RedissonAutoConfiguration; 10 import org.redisson.spring.starter.RedissonAutoConfiguration;
@@ -23,7 +25,6 @@ import org.springframework.test.context.jdbc.Sql; @@ -23,7 +25,6 @@ import org.springframework.test.context.jdbc.Sql;
23 */ 25 */
24 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbAndRedisUnitTest.Application.class) 26 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbAndRedisUnitTest.Application.class)
25 @ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 27 @ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件
26 -@Sql(scripts = "/sql/create_tables.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) // 每个单元测试结束前,创建表  
27 @Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB 28 @Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB
28 public class BaseDbAndRedisUnitTest { 29 public class BaseDbAndRedisUnitTest {
29 30
@@ -33,9 +34,11 @@ public class BaseDbAndRedisUnitTest { @@ -33,9 +34,11 @@ public class BaseDbAndRedisUnitTest {
33 DataSourceAutoConfiguration.class, // Spring DB 自动配置类 34 DataSourceAutoConfiguration.class, // Spring DB 自动配置类
34 DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 35 DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类
35 DruidDataSourceAutoConfigure.class, // Druid 自动配置类 36 DruidDataSourceAutoConfigure.class, // Druid 自动配置类
  37 + SqlInitializationTestConfiguration.class, // SQL 初始化
36 // MyBatis 配置类 38 // MyBatis 配置类
37 YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 39 YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类
38 MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 40 MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类
  41 +
39 // Redis 配置类 42 // Redis 配置类
40 RedisTestConfiguration.class, // Redis 测试配置类,用于启动 RedisServer 43 RedisTestConfiguration.class, // Redis 测试配置类,用于启动 RedisServer
41 RedisAutoConfiguration.class, // Spring Redis 自动配置类 44 RedisAutoConfiguration.class, // Spring Redis 自动配置类
yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/test/BaseDbUnitTest.java
@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.system.test; @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.system.test;
2 2
3 import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration; 3 import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration;
4 import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration; 4 import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration;
  5 +import cn.iocoder.yudao.framework.test.config.SqlInitializationTestConfiguration;
5 import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; 6 import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
6 import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; 7 import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
7 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; 8 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
@@ -20,7 +21,6 @@ import org.springframework.test.context.jdbc.Sql; @@ -20,7 +21,6 @@ import org.springframework.test.context.jdbc.Sql;
20 */ 21 */
21 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbUnitTest.Application.class) 22 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbUnitTest.Application.class)
22 @ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 23 @ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件
23 -@Sql(scripts = "/sql/create_tables.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) // 每个单元测试结束前,创建表  
24 @Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB 24 @Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB
25 public class BaseDbUnitTest { 25 public class BaseDbUnitTest {
26 26
@@ -30,6 +30,7 @@ public class BaseDbUnitTest { @@ -30,6 +30,7 @@ public class BaseDbUnitTest {
30 DataSourceAutoConfiguration.class, // Spring DB 自动配置类 30 DataSourceAutoConfiguration.class, // Spring DB 自动配置类
31 DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 31 DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类
32 DruidDataSourceAutoConfigure.class, // Druid 自动配置类 32 DruidDataSourceAutoConfigure.class, // Druid 自动配置类
  33 + SqlInitializationTestConfiguration.class, // SQL 初始化
33 // MyBatis 配置类 34 // MyBatis 配置类
34 YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 35 YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类
35 MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 36 MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类
yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/test/BaseRedisUnitTest.java
1 package cn.iocoder.yudao.module.system.test; 1 package cn.iocoder.yudao.module.system.test;
2 2
3 import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; 3 import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration;
  4 +import cn.iocoder.yudao.framework.test.config.RedisTestConfiguration;
4 import org.redisson.spring.starter.RedissonAutoConfiguration; 5 import org.redisson.spring.starter.RedissonAutoConfiguration;
5 import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; 6 import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
6 import org.springframework.boot.test.context.SpringBootTest; 7 import org.springframework.boot.test.context.SpringBootTest;
yudao-module-system/yudao-module-system-impl/src/test/resources/application-unit-test.yaml
@@ -16,6 +16,9 @@ spring: @@ -16,6 +16,9 @@ spring:
16 druid: 16 druid:
17 async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度 17 async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度
18 initial-size: 1 # 单元测试,配置为 1,提升启动速度 18 initial-size: 1 # 单元测试,配置为 1,提升启动速度
  19 + sql:
  20 + init:
  21 + schema-locations: classpath:/sql/create_tables.sql
19 22
20 # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 23 # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
21 redis: 24 redis:
@@ -23,6 +26,7 @@ spring: @@ -23,6 +26,7 @@ spring:
23 port: 16379 # 端口(单元测试,使用 16379 端口) 26 port: 16379 # 端口(单元测试,使用 16379 端口)
24 database: 0 # 数据库索引 27 database: 0 # 数据库索引
25 28
  29 +
26 mybatis: 30 mybatis:
27 lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 31 lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试
28 32
yudao-module-system/yudao-module-system-impl/src/test/resources/sql/create_tables.sql
@@ -394,9 +394,14 @@ CREATE TABLE IF NOT EXISTS "system_social_user" ( @@ -394,9 +394,14 @@ CREATE TABLE IF NOT EXISTS "system_social_user" (
394 CREATE TABLE IF NOT EXISTS "system_tenant" ( 394 CREATE TABLE IF NOT EXISTS "system_tenant" (
395 "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, 395 "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
396 "name" varchar(63) NOT NULL, 396 "name" varchar(63) NOT NULL,
  397 + "contact_user_id" bigint NOT NULL,
397 "contact_name" varchar(255) NOT NULL, 398 "contact_name" varchar(255) NOT NULL,
398 "contact_mobile" varchar(255), 399 "contact_mobile" varchar(255),
399 "status" tinyint NOT NULL, 400 "status" tinyint NOT NULL,
  401 + "domain" varchar(63) DEFAULT '',
  402 + "package_id" bigint NOT NULL,
  403 + "expire_time" timestamp NOT NULL,
  404 + "account_count" int NOT NULL,
400 "creator" varchar(64) DEFAULT '', 405 "creator" varchar(64) DEFAULT '',
401 "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 406 "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
402 "updater" varchar(64) DEFAULT '', 407 "updater" varchar(64) DEFAULT '',