我有一个 Web 应用程序,它将 Hibernate Integrator 定义为 Java ServiceLoader 规范的一部分,如下所示:
src/main/resources/META-INF/services/org.hibernate.integrator.spi.Integrator
# Define integrators that should be instantiated by the ServiceLoader
org.emmerich.MyIntegrator
这是根据此处的 Hibernate 指南完成的。
我的问题是,当我尝试执行单元测试时,主 Integrator 描述符仍然被解析和实例化。这意味着,因为我在单元测试中模拟了大部分应用程序,所以当集成器尝试运行它时会遇到导致我的测试失败的错误。
我在测试资源中定义了相同的文件:
src/test/resources/META-INF/services/org.hibernate.integrator.spi.Integrator
# Empty file to try and overwrite the main deployment description.
但相反,我发现测试和主集成器文件都被解析了。
我预计测试资源会覆盖主要资源,从而使主要资源过时,但事实并非如此。由于这两个文件都在类路径上(我通过 Maven 使用 surefire-plugin 运行测试,该插件将两者都test-classes
放在classes
类路径上)。类似的事情发生在persistence.xml
.
在我的单元测试环境中,我不希望实例化任何 Integrator,因为我想尽可能手动地控制这些 bean 的构造。假设我正在测试执行单元,我不希望出现其他可能影响测试运行的 bean,例如 Integrator。我认为这是单元测试期间完全合法的要求。但是,虽然主要资源仍由 解析ServiceLoader
,但这是不可能的。
我来做的解决方案是基于persistence.xml
这里发布的解决方案:
我的问题是,在单元测试期间是否有比强制重命名更好的方法来排除主要资源的处理,尤其是在ServiceLoader
文件的上下文中?
尝试更好地总结一下:
当您在类路径上有两个文件都以相同的服务接口命名时会发生什么?对我来说,似乎两个文件中的所有服务都被实例化了。似乎没有覆盖。