0

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

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

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

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

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

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

有人可以解释一下为什么会这样吗?如何决定何时恢复 clean-db?

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

4

3 回答 3

1

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

解决方法是向@DirtiesContext测试类或测试方法添加注释

于 2012-09-24T13:05:05.077 回答
1

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

在查看此链接之前已经提出了类似的问题。这会很有帮助。

于 2012-09-24T12:56:18.930 回答
0

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

于 2012-09-24T13:20:31.680 回答