如何使用Spring Test在每个案例中加载一次DBUnit测试数据

HDa*_*ave 12 junit dbunit spring-test

Spring Test有助于回滚在测试方法中对数据库所做的任何更改.这意味着在每种测试方法之前没有必要花时间删除/重新加载测试数据.

但是如果使用@BeforeClass Junit注释,则会强制数据加载器保持静态.这里探讨的一个问题: 为什么jUnit的fixtureSetup必须是静态的?

如果数据初始化方法是静态的,那么数据连接方法和数据源也必须......以及......强制一切都是静态的......这是行不通的.在这一点上,我问 - 当你必须为每次测试删除/重新加载测试数据时,Spring Test能够回滚更改有什么用处?!?!

Kkk*_*kev 14

一种方法是创建"数据初始化"类,将其添加到也具有数据源的测试Spring应用程序上下文中,并将此应用程序上下文连接到测试中.这依赖于Spring在测试调用之间缓存应用程序上下文的事实.

例如,测试超类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:test-application-context.xml"})
@Transactional
public abstract class DataLoadingTest {
    @Autowired
    protected DatabaseInitialiser databaseInitialiser;
}
Run Code Online (Sandbox Code Playgroud)

test-application-context.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="dataSource" .../>

    <bean class="DatabaseInitialiser">
        <property name="dataSource" ref="dataSource"/>
    </bean>
</beans>
Run Code Online (Sandbox Code Playgroud)

public class DatabaseInitialiser extends JdbcDaoSupport {
    @PostConstruct
    public void load() {
        // Initialise your database here: create schema, use DBUnit to load data, etc.
    }
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中:

  • 依赖于数据库扩展的所有测试DataLoadingTest;
  • Spring在第一次测试调用时初始化应用程序上下文;
  • DatabaseInitialiser.load()通过@PostConstruct注释来调用;
  • Spring将应用程序上下文保留在缓存中;
  • 进一步测试DatabaseInitialiser来自应用程序上下文的调用,该应用程序上下文已经被缓存;
  • 测试是事务性的,并在最后回滚到初始数据集.

同样,DatabaseInitialiser可以使用注释的方法@PostDestroy在整个测试运行结束时执行必要的回滚.