如何让DBUnit @DatabaseSetup在春季自动装配之前发生?

时间:2013-11-26 04:03:16

标签: spring dbunit spring-test spring-test-dbunit

考虑典型的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设置之前,因此在这个阶段数据将不可用。

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

2 个答案:

答案 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构造方法。这将有效。