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

时间:2014-11-07 04:54:16

标签: java junit junit4 dbunit

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

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

所以想知道在所有测试用例之前/之后我可以设置/拆除db数据集吗?

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

How to allow instance methods to run as JUnit BeforeClass behavior

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

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

相关问题