5

考虑典型的 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() {
         ...
    }
}

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

问题是 UnitUnderTest bean 有一个 @PostConstruct ,它在其中从 DB 加载一些数据,但是由于自动装配发生在 DBunit 设置之前,因此在此阶段数据将不可用。

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

4

2 回答 2

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);
        }

    } 
于 2017-06-12T11:06:12.090 回答
0

您可以在测试类中有一个 setup 方法并手动调用 post 构造方法。那可行。

于 2013-11-26T10:07:50.543 回答