如何在不使用静态 @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 静态页面重建应用的情况下添加新页面?
如何在不创建引用插座的情况下访问静态 TableViewcells 中的文本字段?