如何在不使用静态 @BeforeClass 的情况下设置/拆卸 dbunit 数据集

Posted

技术标签:

【中文标题】如何在不使用静态 @BeforeClass 的情况下设置/拆卸 dbunit 数据集【英文标题】:How to setup/teardown dbunit dataset without using static @BeforeClass 【发布时间】:2014-11-07 04:54:16 【问题描述】:

我正在尝试使用 dbunit 来测试系统的数据库。由于可以使用相同的数据集测试多个测试用例,因此我想为所有测试用例初始化一次数据集。但是我也使用spring的@AutoWire来初始化那些db连接参数。

我尝试使用@BeforeClass 和@AfterClass 来设置数据库。但事实证明@Autowire 在类启动时发生(似乎不适用于自动连接静态成员)。

所以想知道有没有其他方法可以在所有测试用例之前/之后设置/拆除 db 数据集?

我找到了一个优雅的解决方案:

How to allow instance methods to run as JUnit BeforeClass behavior

这篇文章基本上解释了一种改变 unittest runner 来触发事件的方法。 对于spring,也可以使用AbstractTestExecutionListener

【问题讨论】:

【参考方案1】:

只需使用 ApplicationListener 接口初始化数据库。请看一下这个问题: How to add a hook to the application context initialization event?在onApplicationEvent方法中可以创建所有数据。

无论如何不要使用dbunit,只需使用@Transactional 创建所有测试,使用ClassMode=AfterEachTestMethod 创建@DirtiesContext(类级别的DirtiesContext) 所以代码是这样的:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration( "classpath:testContext.xml" )
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
public class YourTestClassTest 
    //...

【讨论】:

我找到了上面发布的解决方案。谢谢你的帮助。但我正在寻找两个实例级别的课前和课后。【参考方案2】:

我还使用 DBUnit 进行集成测试,并在 @Before 和 @After 注释方法中设置/拆除数据,而不是 @BeforeClass/@AfterClass。因此每个测试都会获得其刷新的测试数据。

要为每个测试使用不同的数据集或为单个测试使用不同的替换,您还可以调用 setup(dataSet) 或 setup(replacementList) 方法作为 @Test 注释方法的第一行(而不是 @Before注释)。

【讨论】:

以上是关于如何在不使用静态 @BeforeClass 的情况下设置/拆卸 dbunit 数据集的主要内容,如果未能解决你的问题,请参考以下文章

用于 Spring Boot 应用程序的 JUnit @BeforeClass 非静态工作

如何在不使用 +150k 静态页面重建应用的情况下添加新页面?

如何在不公开所有符号的情况下为 iOS 创建静态库

如何在不创建引用插座的情况下访问静态 TableViewcells 中的文本字段?

如何在我自己的代码中使用 Visual C++ 在不运行静态代码分析的情况下导致 SAL 编译器警告

从弹簧配置中初始化或将字符串注入静态字段 beforeClass (JUNIT) 的优雅方法?