【发布时间】:2021-10-06 10:08:11
【问题描述】:
使用 Spring 进行集成测试,我可以像这样填充运行脚本的测试数据库...
@Test
@Sql({"/db/schema.sql", "/db/accountConfig.sql", "/db/functions/fnSomething.sql"})
public void verifySomething() {
...
}
但是,我希望在运行任何测试之前只运行一次我的所有 .sql 文件。有没有 JUnit 4 的方法来做到这一点?似乎 @Sql 仅针对带有 @Test 注释的方法运行。
我正在使用 Junit 4、Spring Boot、Java 15、Testcontainers。
我尝试过的事情......
- 我尝试在我的测试类扩展的类上使用
@BeforeClass,但它似乎在我的测试之后运行。 - Testcontainers 确实有一个初始化脚本函数,但它只需要一个文件,并不理想。
- 我也尝试过
ScriptUtils.executeSqlScript,但由于某种原因,测试容器不喜欢这样。
这是我的示例代码,适用于@Sql,但不适用于ScriptUtils.executeSqlScript。
@ContextConfiguration(initializers = AbstractIntegrationTest.Initializer.class)
public abstract class AbstractIntegrationTest {
@ClassRule
public static MSSQLServerContainer mssqlserver = new MSSQLServerContainer();
public static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
ConfigurableEnvironment environment = configurableApplicationContext.getEnvironment();
Properties props = new Properties();
props.put("spring.datasource.driver-class-name", mssqlserver.getDriverClassName());
props.put("spring.datasource.url", mssqlserver.getJdbcUrl());
props.put("spring.datasource.username", mssqlserver.getUsername());
props.put("spring.datasource.password", mssqlserver.getPassword());
environment
.getPropertySources()
.addFirst(new PropertiesPropertySource("myTestDBProps", props));
configurableApplicationContext.setEnvironment(environment);
}
}
我的测试类只是扩展AbstractIntegrationTest。但是使用@Sql 会为每个测试用例运行脚本。有没有人有更好的方法来初始化 SQL 脚本的建议?尝试过flyway,但它不允许从脚本创建数据库。
【问题讨论】:
-
Liquibase 非常适合设置和管理测试数据库数据集。 docs.liquibase.com/tools-integrations/springboot/…
标签: java spring spring-boot junit4 testcontainers