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 3 import com.github.fppt.jedismock.RedisServer;
4 4 import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
... ... @@ -9,6 +9,11 @@ import org.springframework.context.annotation.Lazy;
9 9  
10 10 import java.io.IOException;
11 11  
  12 +/**
  13 + * Redis 测试 Configuration,主要实现内嵌 Redis 的启动
  14 + *
  15 + * @author 芋道源码
  16 + */
12 17 @Configuration(proxyBeanMethods = false)
13 18 @Lazy(false) // 禁止延迟加载
14 19 @EnableConfigurationProperties(RedisProperties.class)
... ... @@ -20,7 +25,7 @@ public class RedisTestConfiguration {
20 25 @Bean
21 26 public RedisServer redisServer(RedisProperties properties) throws IOException {
22 27 RedisServer redisServer = new RedisServer(properties.getPort());
23   - // TODO 芋艿:一次执行多个单元测试时,貌似创建多个 spring 容器,导致不进行 stop。这样,就导致端口被占用,无法启动。。。
  28 + // 一次执行多个单元测试时,貌似创建多个 spring 容器,导致不进行 stop。这样,就导致端口被占用,无法启动。。。
24 29 try {
25 30 redisServer.start();
26 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 3 import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration;
4 4 import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration;
5 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 8 import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
7 9 import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
8 10 import org.redisson.spring.starter.RedissonAutoConfiguration;
... ... @@ -23,7 +25,6 @@ import org.springframework.test.context.jdbc.Sql;
23 25 */
24 26 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbAndRedisUnitTest.Application.class)
25 27 @ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件
26   -@Sql(scripts = "/sql/create_tables.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) // 每个单元测试结束前,创建表
27 28 @Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB
28 29 public class BaseDbAndRedisUnitTest {
29 30  
... ... @@ -33,9 +34,11 @@ public class BaseDbAndRedisUnitTest {
33 34 DataSourceAutoConfiguration.class, // Spring DB 自动配置类
34 35 DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类
35 36 DruidDataSourceAutoConfigure.class, // Druid 自动配置类
  37 + SqlInitializationTestConfiguration.class, // SQL 初始化
36 38 // MyBatis 配置类
37 39 YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类
38 40 MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类
  41 +
39 42 // Redis 配置类
40 43 RedisTestConfiguration.class, // Redis 测试配置类,用于启动 RedisServer
41 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 2  
3 3 import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration;
4 4 import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration;
  5 +import cn.iocoder.yudao.framework.test.config.SqlInitializationTestConfiguration;
5 6 import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
6 7 import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
7 8 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
... ... @@ -20,7 +21,6 @@ import org.springframework.test.context.jdbc.Sql;
20 21 */
21 22 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbUnitTest.Application.class)
22 23 @ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件
23   -@Sql(scripts = "/sql/create_tables.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) // 每个单元测试结束前,创建表
24 24 @Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB
25 25 public class BaseDbUnitTest {
26 26  
... ... @@ -30,6 +30,7 @@ public class BaseDbUnitTest {
30 30 DataSourceAutoConfiguration.class, // Spring DB 自动配置类
31 31 DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类
32 32 DruidDataSourceAutoConfigure.class, // Druid 自动配置类
  33 + SqlInitializationTestConfiguration.class, // SQL 初始化
33 34 // MyBatis 配置类
34 35 YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类
35 36 MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类
... ...
yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/test/BaseRedisUnitTest.java
1 1 package cn.iocoder.yudao.module.system.test;
2 2  
3 3 import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration;
  4 +import cn.iocoder.yudao.framework.test.config.RedisTestConfiguration;
4 5 import org.redisson.spring.starter.RedissonAutoConfiguration;
5 6 import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
6 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 16 druid:
17 17 async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度
18 18 initial-size: 1 # 单元测试,配置为 1,提升启动速度
  19 + sql:
  20 + init:
  21 + schema-locations: classpath:/sql/create_tables.sql
19 22  
20 23 # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
21 24 redis:
... ... @@ -23,6 +26,7 @@ spring:
23 26 port: 16379 # 端口(单元测试,使用 16379 端口)
24 27 database: 0 # 数据库索引
25 28  
  29 +
26 30 mybatis:
27 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 394 CREATE TABLE IF NOT EXISTS "system_tenant" (
395 395 "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
396 396 "name" varchar(63) NOT NULL,
  397 + "contact_user_id" bigint NOT NULL,
397 398 "contact_name" varchar(255) NOT NULL,
398 399 "contact_mobile" varchar(255),
399 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 405 "creator" varchar(64) DEFAULT '',
401 406 "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
402 407 "updater" varchar(64) DEFAULT '',
... ...