JUnit测试在类测试和项目测试之间有所不同



我在Java应用程序中遇到了一个与单元测试有关的奇怪错误。

在单元测试期间,我使用预先填充了自定义数据的内存HSQLDB(通过自动触发的插入脚本)和Hibernate作为ORM来访问它

问题如下,如果我在单个类(即:TestDummyClass.java)上启动单元测试,则在每次方法测试后都会重新创建数据库(从原始插入脚本)。

如果我在包含多个测试类的整个项目(src/test)上启动单元测试,那么DB将在每个测试类的开头初始化,而不是在每个测试方法上初始化。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:com/wizche/app-context-test.xml" })
public class TestDummyClass {
.....
}

这意味着,例如,如果在TestDummyClass中,我在某个测试方法中更改了DB(即创建一个新对象),那么对于同一类中的以下测试方法,新对象将保留在那里。因此,如果我在项目或单个类上启动断言,则断言应该不同!

有人能解释一下为什么会发生这种事吗?如何决定何时恢复干净的数据库?

注意:我使用SpringJUnit4ClassRunner,为整个测试项目提供自定义上下文配置(其中没有与单元测试相关的参数)。NB2:我在SpringEclipse 中直接启动JUnit

原因是,如果你使用SpringJUnit4ClassRunner,如果你对多个测试使用完全相同的位置,它往往会缓存应用程序上下文-这种缓存是跨套件的,所以如果你在一个套件中执行项目中的所有测试,并在多个测试中使用相同的应用程序上下文位置,您很可能会得到一个缓存的上下文,如果您在上下文中修改bean,这也会反映在其他测试中。

修复方法是将@DirtiesContext注释添加到测试类或测试方法

Eclipse在单个JVM中运行单元测试,因此理论上即使在单个类上运行,也应该看到与从src/test运行相同的行为。我认为运行你所有的测试你更有可能发现问题。当您进行单个类测试时,是什么确保在每个方法之后重新创建DB?只是想确保这是准确的?

在查看此链接之前,也提出了类似的问题。这将很有帮助。

我建议使用DBUnit来帮助构建&拆除数据库。它提供了实时执行此操作的方法,并与所有主要数据库提供程序进行交互。

最新更新