gpt4 book ai didi

junit - 如何使用 Spring Test 为每个案例加载一次 DBUnit 测试数据

转载 作者:行者123 更新时间:2023-12-04 00:53:30 26 4
gpt4 key购买 nike

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

但是,如果您使用 @BeforeClass Junit 注释,则会强制数据加载器为静态。此处探讨的问题:Why must jUnit's fixtureSetup be static?

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

最佳答案

一种有效的方法是创建一个“数据初始值设定项”类,将其添加到也包含您的数据源的测试 Spring 应用程序上下文中,然后将此应用程序上下文连接到您的测试中。这依赖于 Spring 在测试调用之间缓存应用程序上下文的事实。

例如,一个测试父类(super class):

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

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>

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

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

  • 同样, DatabaseInitialiser可以有一个方法注释 @PostDestroy在整个测试运行结束时执行任何必要的回滚。

    关于junit - 如何使用 Spring Test 为每个案例加载一次 DBUnit 测试数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3007425/

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