Commit c64bb81caeee2721e0c373eee014e3977d88cb37
1 parent
10ba70e1
解决 spring.sql.init.schema-locations 不自动初始化,通过自定义的 SqlInitializationTestConfiguration 实现
Showing
7 changed files
with
75 additions
and
4 deletions
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 '', |