我有很多集成测试,我已经设置了liquibase,这样数据库就可以初始化了。但是每个测试类都初始化一个新的初始化。在这种情况下,重复数据错误是不可避免的。我找到了一些避免这种情况的建议,但是遇到了一个问题。
- changelog-1.xml
<databaseChangeLog
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">
<changeSet author="n" context="test" id="1" runOnChange="false">
<sqlFile encoding="utf8" endDelimiter="\nGO" path="classpath:dump.sql" relativeToChangelogFile="false"/>
</changeSet>
</databaseChangeLog>
- 主控
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">
<include file="xml/changelog-1.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>
我还编写了一个配置类。
Package 中:
- liquibase.ext
public class CleanUpDatabaseTestExecutionListener extends AbstractTestExecutionListener {
@Autowired
SpringLiquibase liquibase;
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
@Override
public void afterTestClass(TestContext testContext) throws Exception {
testContext.getApplicationContext()
.getAutowireCapableBeanFactory()
.autowireBean(this);
liquibase.afterPropertiesSet();
}
}
- 上下文
@Slf4j
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@TestExecutionListeners(listeners = {
DependencyInjectionTestExecutionListener.class,
TransactionalTestExecutionListener.class,
CleanUpDatabaseTestExecutionListener.class,
})
public abstract class AbstractTestcontainers extends ContainerConfig {
我收到一个错误:liquibase.异常.迁移失败异常:迁移更改集数据库/更改日志/测试/liquibase-initdb失败。xml::1::n:原因:liquibase.异常.数据库异常:错误:类型"calc_types"已存在[失败的SQL:(0)----PostgreSQL数据库转储
spring. liquibase. drop-first = true-它不工作。
也许谁知道我该怎么改正呢?
1条答案
按热度按时间0mkxixxg1#
当时,我这么做
我不得不给予:
@脏上下文(类模式=类模式.在类之前)
我不得不翘掉一些课
清除表格并填入新数据。
Liquibase配置运行了一次,至少我没有看到任何冲突。因为我们已经创建了一个类来引发上下文,并且所有其他集成测试都是使用此上下文执行的。当然,测试类本身是错误创建的,因此有必要使用**@AfterClass或@AfterMethod**注解从数据库中清除数据。但是,现在,大约300个测试的执行已经减少了大约4倍。
如果这个问题还有其他解决办法,请来信。