考虑典型的DBUnit Spring Test(参见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() {
...
}
}
我已经验证的是,并且预计,自动装配将在DatabaseSetup之前发生。 这必须发生,因为DBUnit依赖于应用程序上下文来提供配置的数据源。
问题是UnitUnderTest bean有一个@PostConstruct,它从DB加载一些数据但是,由于自动装配发生在DBunit设置之前,因此在这个阶段数据将不可用。
关于如何以干净的方式解决这个问题的任何想法?
答案 0 :(得分:1)
你可以使用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);
}
}
答案 1 :(得分:0)
您可以在测试类中使用设置方法并手动调用post构造方法。这将有效。