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 | 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 '', | ... | ... |