gpt4 book ai didi

spring - 如何在 Spring Autowiring 之前让 DBUnit @DatabaseSetup 发生?

转载 作者:行者123 更新时间:2023-12-04 17:07:19 24 4
gpt4 key购买 nike

考虑典型的 DBUnit Spring 测试(参见 https://github.com/springtestdbunit/spring-test-dbunit):

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
"classpath:/META-INF/spring/applicationContext-database.xml",
"classpath:spring-*.xml"
})
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class,
TransactionalTestExecutionListener.class,
DbUnitTestExecutionListener.class })
@DatabaseSetup("/dbunit/data.xml")
public class UnitTest {

@Autowired
private UnitUnderTest uut;

@Test
public void shouldInitDB() {
...
}
}

我已经证实,并且已经预料到, Autowiring 将在 DatabaseSetup 之前发生。
这必须发生,因为 DBUnit 依赖于应用程序上下文来提供配置的数据源。

问题是 UnitUnderTest bean 有一个 @PostConstruct,它从 DB 加载一些数据,但是,由于 Autowiring 发生在 DBunit 设置之前,数据在这个阶段将不可用。

关于如何以干净的方式解决这个问题的任何想法?

最佳答案

您可以使用 Spring 的 ResourceDatabasePopulator。

我想你可以使用这样的东西

@PostConstruct
public void myInMemryPopulator() {
final ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator();

try {

Resource[] array = resourceResolver.getResources("classpath:/*.sql");

for (Resource resource : array) {

databasePopulator.addScript(resource);
}
databasePopulator.populate(dataSource.getConnection());

} catch (IOException | SQLException e) {
LOGGER.error("Error in databasePopulator {} ", e);
}

}

关于spring - 如何在 Spring Autowiring 之前让 DBUnit @DatabaseSetup 发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20208248/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com