Resteasy-Spring:在具有多个正在运行的实例的测试期间加载了错误的应用实例

时间:2017-01-28 12:02:11

标签: spring intellij-idea spring-boot resteasy

问题摘要

我编写了一个简单的REST HTTP接口,使用Spring Boot构建,在调用GET /app时返回一个简单的文本响应,基于ClientInterface的实现,其中有2个。功能是使用JAX-RS实现的,通过RestEasy-SpringBoot library重新提供。

我还编写了3个测试,其中第3个测试失败,因为响应来自ClientInterface的第二个实现而不是第一个实现,因为(我假设)Resteasy正在混淆应用程序实例,因此加载了错误的Spring应用程序上下文,错误的bean

注意:您可以找到示例应用here,其中包含文档

请查看源代码以获得清晰的图片。它也会占用太多的空间来粘贴代码。

更多详情

ClientInterface有2个实现,它们提供REST资源给出的响应。使用client-impl-two个人资料切换它们。如果配置文件不存在,则使用第一个实现,如果存在,则使用第二个实现。

第一个第三个​​测试期望来自第一个实现的响应,第二个测试期望来自秒实现的响应,因为它正在使用client-two-impl个人资料。

当我使用IntelliJ的JUnit集成运行测试时,第三个失败: enter image description here enter image description here

您会注意到测试被命名为强制执行某个执行顺序,这是相关的,因为第三个测试仅在第二个测试执行后才会失败。它失败了,因为它得到了第二个ClientInterface实现的响应,,即使第三个测试没有使用client-impl-two个人资料

到目前为止我做过/发现的事情

  • 有时,运行./mvnw clean test也会出现相同的错误结果,但我无法提供可重现的示例
  • Spring / Spring Boot
  • 正确加载了Spring Application上下文
  • Spring Boot正确注入端口号,测试中的其余客户端总是调用它们应该的REST实例
  • 只有当Resteasy接管请求时,才会以某种方式加载应用程序的错误实例,因此使用了错误的Spring Application上下文,这就是为什么它会给出不正确的响应
    • 我通过在 SpringResourceFactory.createResource()中保留一个断点来解决这个问题,它只是查询资源bean的beanFactory,并调用beanFactory.getBean(ClientInterface.class)来查看哪个实现出现了,第三次测试是错误的
  • 在测试过程中,有多个应用程序实例正在运行,每个实例都在自己的端口上,我认为这个问题与问题有关
  • 还有另一个分支jersey-instead-of-resteasy,其中Jersey用作JAX-RS实现,无论是使用IntelliJ还是使用Maven运行,测试都是成功的
  • 有一个DebugFilter,我可以在Resteasy servlet接管请求之前检查Spring Application上下文的内容,它始终是正确的(ClientInterface的正确实现加载),无论如何执行测试
    • 只有在运行第三次测试时,当请求到达Resteasy时,才会加载不正确的应用实例,如上述其中一项所述

基于以上几点,我强烈怀疑Resteasy可能是个问题。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

我已经调试了一下,我相信失败是由resteasy-spring-boot-starter中的错误引起的。我刚刚在github上创建了一个问题并提供了一个PR [2]来修复它并让你的测试通过。 我也在评论[3]。感谢伟大的描述和再现。

  1. https://github.com/paypal/resteasy-spring-boot/issues/51
  2. https://github.com/paypal/resteasy-spring-boot/pull/52
  3. https://issues.jboss.org/browse/RESTEASY-1595