问题摘要:
我编写了一个简单的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集成运行测试时,第三个失败:
您会注意到测试被命名为强制执行某个执行顺序,这是相关的,因为第三个测试仅在第二个测试执行后才会失败。它失败了,因为它得到了第二个ClientInterface
实现的响应,,即使第三个测试没有使用client-impl-two
个人资料。
到目前为止我做过/发现的事情:
./mvnw clean test
也会出现相同的错误结果,但我无法提供可重现的示例beanFactory
,并调用beanFactory.getBean(ClientInterface.class)
来查看哪个实现出现了,第三次测试是错误的jersey-instead-of-resteasy
,其中Jersey用作JAX-RS实现,无论是使用IntelliJ还是使用Maven运行,测试都是成功的DebugFilter
,我可以在Resteasy servlet接管请求之前检查Spring Application上下文的内容,它始终是正确的(ClientInterface
的正确实现加载),无论如何执行测试
基于以上几点,我强烈怀疑Resteasy可能是个问题。
非常感谢任何帮助。
答案 0 :(得分:2)
我已经调试了一下,我相信失败是由resteasy-spring-boot-starter中的错误引起的。我刚刚在github上创建了一个问题并提供了一个PR [2]来修复它并让你的测试通过。 我也在评论[3]。感谢伟大的描述和再现。