Spring、spring Batch、hibernate 和 JUnit 以及多个集成测试的初始化

标签 spring hibernate junit spring-batch

我有一些使用 spring-batch 和 hibernate 的测试类。我的测试上下文在内存数据库中建立了一个 h2,初始化了 hibernate session 工厂,它创建了大部分数据库模式,并且还执行一些特定的 SQL 脚本来设置 Spring Batch(非 Orm)所需的数据库模式对象。 Hibernate 做得非常好,只做必要的事情,但是 spring-batch 初始化脚本并不那么智能。

我的测试配置使用 h2 嵌入式数据库,因此我可以安全地初始化所有内容一次,但是,我需要传达给 spring 仅初始化一次其余集成基础设施(例如 hbm session 工厂和 spring-batch 模式)正在运行的整个测试集合。

我的单元测试都是单独运行的,但是测试整个包时测试 2 到 N 会失败,因为它们重复执行相同的数据库模式初始化,并且在 (db) 对象已存在错误上死亡。

我希望为整个集成测试集合初始化应用程序上下文,然后将特定测试的详细信息配置委托(delegate)给 MyTest 上下文,但在运行单个集成测试时仍然初始化主应用程序上下文。

我有一组通用的 spring 配置文件,这些文件被导入到测试上下文中以初始化测试应用程序服务所需的基础设施。问题来自于运行包中的所有测试等。测试系统多次调用相同的初始化。

我希望这是一个非常常见的问题,并且我忽略了 spring 或 JUnit 文档中的一个细节。

最佳答案

  1. 默认情况下,Spring caches ApplicationContext instances已加载用于测试。它初始化一个新文件的唯一原因是测试使用一组不同的上下文文件,因此需要不同的上下文,或者测试使用 @DirtiesContext annotation .
  2. 为什么不直接添加 "if not exists"到你的sql脚本?

关于Spring、spring Batch、hibernate 和 JUnit 以及多个集成测试的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6837472/

相关文章:

java - Hibernate 4.3 映射文件错误

java - 如何在不重复java中其他方法的情况下调用一个方法

java - Spring - 延迟注入(inject)

java - 使用 Java 的 Activity 流

java - 将带 collection.size 的 hibernate HQL 转换为条件查询

java - Spring MVC 中的 HibernateTransactionManager 错误

java - 无法模拟 EntityManager jMockit

Spring 我应该在每个类(class)上使用@DirtiesContext

java - LazyInitializationException 尽管有 OpenSessionInViewFilter

java - 在 Spring 中编写自定义 PlaceholderResolver(如 PropertyPlaceholderConfigurerResolver)