单元测试中如何让SpringLiquibase加载非resources目录的Liquibase脚本
解决SpringLiquibase加载任意目录Liquibase脚本的问题
你的核心问题是SpringLiquibase默认通过classpath:前缀仅扫描类路径资源(如main/resources、test/resources),而db/liquibase_scripts不在类路径范围内,导致无法直接加载。以下是几种无需复制重复脚本的解决方案:
方案一:将db目录加入测试类路径(推荐)
通过构建工具把db/liquibase_scripts添加到单元测试的类路径中,这样就能用classpath:前缀直接访问脚本。
Maven配置
在pom.xml的build节点下添加测试资源配置:
<build> <testResources> <testResource> <directory>src/test/resources</directory> </testResource> <testResource> <directory>db/liquibase_scripts</directory> <includes> <include>**/*.json</include> <include>**/*.xml</include> <!-- 按需添加其他Liquibase脚本格式 --> </includes> </testResource> </testResources> </build>
配置完成后,单元测试运行时db/liquibase_scripts下的脚本会被视为类路径资源,修改Bean代码如下:
@Bean public SpringLiquibase springLiquibase() { SpringLiquibase springLiquibase = new SpringLiquibase(); springLiquibase.setDataSource(dataSource()); springLiquibase.setChangeLog("classpath:/schema.json"); return springLiquibase; }
Gradle配置
在build.gradle中添加测试资源目录配置:
sourceSets { test { resources { srcDirs = ['src/test/resources', 'db/liquibase_scripts'] include '**/*.json', '**/*.xml' } } }
方案二:直接使用文件系统路径
如果不想修改类路径,可以通过文件系统路径直接访问脚本,相对路径以项目根目录为基准:
@Bean public SpringLiquibase springLiquibase() { SpringLiquibase springLiquibase = new SpringLiquibase(); springLiquibase.setDataSource(dataSource()); springLiquibase.setChangeLog("file:db/liquibase_scripts/schema.json"); return springLiquibase; }
注意:这种方式依赖固定的项目目录结构,项目移动后路径会失效,通用性较差。
方案三:自定义资源加载器
如果需要更高灵活性,可以自定义Spring资源加载器,优先从db目录加载资源, fallback到默认类路径:
@Bean public SpringLiquibase springLiquibase() { SpringLiquibase springLiquibase = new SpringLiquibase(); springLiquibase.setDataSource(dataSource()); // 自定义资源加载器 PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); resolver.setResourceLoader(new DefaultResourceLoader() { @Override protected Resource getResourceByPath(String path) { File dbResource = new File("db/liquibase_scripts/" + path); if (dbResource.exists()) { return new FileSystemResource(dbResource); } return super.getResourceByPath(path); } }); springLiquibase.setResourceLoader(resolver); springLiquibase.setChangeLog("schema.json"); return springLiquibase; }
内容的提问来源于stack exchange,提问作者Haster
相关产品推荐
相关产品推荐

