Java 每次集成测试后,Spring上下文都会变脏

Java 每次集成测试后,Spring上下文都会变脏,java,spring,testing,dependencies,integration,Java,Spring,Testing,Dependencies,Integration,我最近开始做我当前项目的自由职业者。我全身心地投入其中的一件事就是失败的Jenkins构建(从4月8日开始,也就是我开始这里的前一周开始,它就失败了) 一般来说,您可以在日志中看到大量DI问题。我做的第一件事是让所有测试以相同的方式工作,从相同的应用程序上下文开始。 他们还实现了自己的“嘲弄”功能,但似乎无法正常工作。在与开发负责人讨论之后,我建议开始使用Springockito。(对于某个模块,他们的集成测试需要模拟——遗留原因,无法更改) 不管怎么说,从那以后,事情开始严重恶化。很多在测试中

我最近开始做我当前项目的自由职业者。我全身心地投入其中的一件事就是失败的Jenkins构建(从4月8日开始,也就是我开始这里的前一周开始,它就失败了)

一般来说,您可以在日志中看到大量DI问题。我做的第一件事是让所有测试以相同的方式工作,从相同的应用程序上下文开始。 他们还实现了自己的“嘲弄”功能,但似乎无法正常工作。在与开发负责人讨论之后,我建议开始使用Springockito。(对于某个模块,他们的集成测试需要模拟——遗留原因,无法更改)

不管怎么说,从那以后,事情开始严重恶化。很多在测试中被模仿的豆子,只是没有被模仿,或者没有被发现或者其他什么。通常,它会在加载应用程序上下文时失败,表明缺少一个或另一个bean

我尝试了不同的东西和不同的方法,但最终,只有我最担心的一件事会起作用:在每个测试中添加@DirtiesContext。现在,maven构建又开始变绿,测试开始做他们应该做的事情。但是我每次都在重新加载Spring上下文,这需要时间——这都是相对的,因为上下文的加载大约需要1-2秒

这个故事的附带说明是,他们已经升级到Hibernate4,从而升级到Spring3.2。以前,他们使用的是旧版本的Spring3。当时所有的测试都在运行,@DirtiesContext这个东西是不必要的

现在,最让我担心的是,我无法立即为这种奇怪的行为找到解释。似乎Springs的上下文被弄脏了,只需启动一个使用@autowiredbean的测试。不是所有的测试都使用模拟,所以不可能是这样。 这听起来有人熟悉吗?有没有人有过与Spring(最新版本)相同的集成测试经验

在Stackoverflow上,我找到了这张票: 这似乎在很大程度上概括了我所看到的行为,但关键是我们是自动连接服务/存储库/…,并且我们在这些类上没有任何设置器

有什么想法吗


谢谢

回答我自己的问题,秘密就在春季版本中。我们使用的是Spring3.1.3,而我认为他们使用的是Spring3.2(他们一直在谈论Spring版本的最新升级)

解释就在这里,一篇我在寻找修复方法时偶然发现的博文:

以及相关作品的复制粘贴:

Spring配置中泛型工厂方法的使用决不是针对>测试的,但诸如EasyMock.createMock(MyService.class)或Mockito.mock(MyService.class)之类的泛型工厂方法通常用于在>测试应用程序上下文中为SpringBean创建动态模拟。例如,在SpringFramework 3.2之前,以下>配置可能无法将OrderRepository自动连接到OrderService。原因是>根据bean在应用程序上下文中的初始化顺序,>Spring可能会推断orderRepository bean的类型为java.lang.Object>而不是com.example.repository.orderRepository

那么,我是如何解决这个问题的呢?嗯,我做了以下步骤:

  • 创建一个新的maven模块
  • 过滤掉需要模拟的测试。所有非模拟测试都将在Spring构建中正常运行,并在单独的故障保护运行中运行(我创建了一个基本包“clean”,并像这样对它们进行排序)
  • 将所有模拟测试放在一个名为“mocked”的基本包中,并为模拟测试进行额外的故障保护运行
  • 每个模拟测试都使用Springockito来创建模拟。我还使用Springockito注释,轻松地在原地执行@ReplaceWithMock。然后,每个模拟测试都用@DirtiesContext注释,因此在每个测试之后,上下文都会被弄脏,并且每次测试都会重新引入Spring上下文
我能给出的唯一合理解释是,上下文实际上被弄脏了,因为有一个框架(Springockito)从Spring框架接管了springbean的管理。我不知道这是否正确,但这是我能想到的最好的解释。事实上,这就是脏上下文的定义,这就是为什么我们需要将其标记为脏上下文


使用这个策略,我得到了构建并再次运行,所有测试都正常运行。这不是完美的,但它是有效的,而且是一致的

我没有使用spring测试上下文,因为我所有的测试都没有指导上下文。我甚至不知道这是可能的;)春季3.2,冬眠4.2。是不是有一些后处理器在起作用?一些bean定义在两次启动之间发生了变化,自动连线正在解析为新bean,因此可能会出现脏标记。我会记住后处理器的,谢谢!现在,我正试图找出上下文的加载程序。当您使用Springockito时,您需要将SpringockitoContextLoader.class作为上下文加载器——然而,我并没有在任何地方都使用该上下文加载器,这可能就是原因所在。这将解释为什么Spring找不到框架在之前的测试中加载的某些bean。