我在Java应用程序中遇到了与单元测试相关的奇怪错误。
在单元测试期间,我使用预填充自定义数据的内存中HSQLDB(通过自动触发的Insert脚本)和Hibernate作为ORM来访问它。
问题如下,如果我在单个类(即:TestDummyClass.java)上启动单元测试,则在每次方法测试后重新创建db(来自原始插入脚本)。
如果我在包含多个测试类的整个项目(src / test)上启动单元测试,则DB在每个测试类的开头初始化,而不是在每个测试方法上初始化。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:com/wizche/app-context-test.xml" })
public class TestDummyClass {
.....
}
这意味着,例如,如果在TestDummyClass中我在某个测试方法中更改了DB(即创建一个新对象),则新对象将保留在同一个类中的以下测试方法中。因此,如果我在项目或单个类上启动断言,则断言应该不同!
有人能解释我为什么会这样吗?我怎样才能决定何时恢复clean-db?
注意:我正在使用SpringJUnit4ClassRunner和整个测试项目的自定义上下文配置(其中没有与单元测试相关的参数)。 NB2:我在SpringEclipse中直接启动JUnit
答案 0 :(得分:1)
Eclipse在单个JVM中运行单元测试,因此理论上甚至在单个类上运行,您应该看到与从src / test运行相同的行为。我在考虑运行所有测试你更有可能发现问题。什么使您确保在单个类测试后在每个方法之后重新创建数据库 - 只是想确保这是准确的?
在检查link之前,已经提出了类似的问题。这将有所帮助。
答案 1 :(得分:1)
原因是如果你使用SpringJUnit4ClassRunner,如果你为多个测试使用完全相同的位置,它往往会缓存应用程序上下文 - 这个缓存是跨套件的,所以如果你在一个套件中执行项目中的所有测试并且在多个测试中使用相同的应用程序上下文位置,很可能会获得缓存的上下文 - 如果您在上下文中修改bean,那么也会反映其他测试。
修复是将@DirtiesContext
注释添加到测试类或测试方法
答案 2 :(得分:0)
我建议使用DBUnit协助构建&拆除数据库。它提供了即时执行此操作并与所有主数据库提供程序进行交互的方法。