【发布时间】:2013-04-19 12:38:02
【问题描述】:
我有一个 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 指南 here 完成的。
我的问题是,当我尝试执行单元测试时,主 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 也会发生类似的情况。
在我的单元测试环境中,我不希望实例化任何集成器,因为我想尽可能手动地控制这些 bean 的构建。假设我正在测试执行单元,我不希望出现其他可能影响测试运行的 bean,例如 Integrator。我认为这是单元测试期间完全合法的要求。但是,虽然主要资源仍由 ServiceLoader 解析,但这是不可能的。
我来做的解决方案是基于这里发布的persistence.xml 解决方案:
How to configure JPA for testing in Maven
我的问题是,在单元测试期间是否有比强制重命名更好的方法来排除主要资源的处理,尤其是在 ServiceLoader 文件的上下文中?
尝试更好地总结一下:
当您在类路径上有两个文件都以相同的服务接口命名时会发生什么?对我来说,似乎两个文件中的所有服务都被实例化了。似乎没有覆盖。
【问题讨论】:
标签: java hibernate jpa service serviceloader