java - JUnit-Test 类测试和项目测试之间存在差异

标签 java spring hibernate junit hsqldb

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

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

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

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

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

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

有人可以解释一下为什么会发生这种情况吗?我如何决定何时恢复 clean-db?

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

最佳答案

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

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

关于java - JUnit-Test 类测试和项目测试之间存在差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12565266/

相关文章:

java - Hibernate 类未使用 Eclipse Juno 和 GWT 导入 : LockMode, SessionFactory、Criterion

java - 为什么要同步Java方法Provider.getService(String type,String algorithm)?

java - Spring+hibernate 创建在类路径资源 [applicationContext.xml] 中定义的名称为 'dataSource' 的 bean 时出错

spring - RedisCacheManager 在代码中 Autowiring 但未按预期工作

java - 多个带有配置文件的 Spring Boot 应用程序类

mysql - BoneCP 连接超时

Java Hibernate Hierachy子类中不同的JoinColumn Column 'C01'指定了两次

java - java android 获取两个位置之间的距离

java - org.mockito.exceptions.misusing.InvalidUseOfMatchersException 有效表达式

java - 如何复制格式为“bucketName/folder1/folder2”的存储桶的内容