@SpringBootTest 干扰EclipseLink动态织入

@SpringBootTest interferes with EclipseLink dynamic weaving

我的公司正在使用 Spring Boot、Spring MVC、带有 EclipseLink 和动态编织的 JPA 开发 Web 应用程序。 我的任务是准备 UI 的实施和集成测试,使用 JUnit 和 @SpringBootTest 启动应用程序并使用 Selenium 与其交互。

Spring Boot Testing Features 所述, 使用 @SpringBootApplication 注释的测试可以使用 @MockBean 注释为 ApplicationContext 中的 bean 定义 Mockito 模拟。 这是通过注册 BeanFactoryPostProcessorMockitoPostProcessor、递归扫描 类 注释 @Component@Configuration 来实现 类 和字段注释 @MockBean.

不幸的是,这会导致 类 中引用的实体 类 在应该扫描它们的 LocalContainerEntityManagerFactoryBean 被实例化并使用 LoadTimeWeaver,从而导致跳过这些实体的加载时间编织。 当执行持久性操作时,这会导致 NoSuchMethodException_persistence_propertyChange() 这样编织创建的方法。

是否可以将 @SpringBootTest 与 EclipseLink 和动态编织一起使用? 如果没有,什么是设置集成测试的好选择 最近的 Spring 引导版本?

我通过使用自定义 SpringApplicationRunListenercontextPrepared() 在 [=16= 执行之前从 ApplicationContext 中删除有问题的 BeanFactoryPostProcessor 解决了这个问题=].

我们在使用 Spring Boot 2.1.6 和 EclipseLink 2.7.6 构建的 Web 应用程序中遇到了同样的问题。

Is it possible to use @SpringBootTest with EclipseLink and dynamic weaving? If not, what would be a good alternative to set up an integration test for a recent Spring Boot version?

解决方案是在 @SpringBootTest 中将 eclipselink.weaving JPA 属性 设置为 false,并在常规操作中设置为 true

持久性配置:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="jpaProperties">
        <props>
            <prop key="eclipselink.weaving">${jpa.eclipselink.weaving}</prop>
        </props>
    </property>
    <!-- ... -->
</bean>

然后在 application.properties:

jpa.eclipselink.weaving=true

并在 JUnit 测试中 class:

@TestPropertySource(properties = "jpa.eclipselink.weaving=false")