@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 模拟。
这是通过注册 BeanFactoryPostProcessor
、MockitoPostProcessor
、递归扫描 类 注释 @Component
或 @Configuration
来实现 类 和字段注释 @MockBean
.
不幸的是,这会导致 类 中引用的实体 类 在应该扫描它们的 LocalContainerEntityManagerFactoryBean
被实例化并使用 LoadTimeWeaver
,从而导致跳过这些实体的加载时间编织。
当执行持久性操作时,这会导致 NoSuchMethodException
像 _persistence_propertyChange()
这样编织创建的方法。
是否可以将 @SpringBootTest
与 EclipseLink 和动态编织一起使用?
如果没有,什么是设置集成测试的好选择
最近的 Spring 引导版本?
我通过使用自定义 SpringApplicationRunListener
的 contextPrepared()
在 [=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")
我的公司正在使用 Spring Boot、Spring MVC、带有 EclipseLink 和动态编织的 JPA 开发 Web 应用程序。 我的任务是准备 UI 的实施和集成测试,使用 JUnit 和 @SpringBootTest 启动应用程序并使用 Selenium 与其交互。
如 Spring Boot Testing Features 所述,
使用 @SpringBootApplication
注释的测试可以使用 @MockBean
注释为 ApplicationContext 中的 bean 定义 Mockito 模拟。
这是通过注册 BeanFactoryPostProcessor
、MockitoPostProcessor
、递归扫描 类 注释 @Component
或 @Configuration
来实现 类 和字段注释 @MockBean
.
不幸的是,这会导致 类 中引用的实体 类 在应该扫描它们的 LocalContainerEntityManagerFactoryBean
被实例化并使用 LoadTimeWeaver
,从而导致跳过这些实体的加载时间编织。
当执行持久性操作时,这会导致 NoSuchMethodException
像 _persistence_propertyChange()
这样编织创建的方法。
是否可以将 @SpringBootTest
与 EclipseLink 和动态编织一起使用?
如果没有,什么是设置集成测试的好选择
最近的 Spring 引导版本?
我通过使用自定义 SpringApplicationRunListener
的 contextPrepared()
在 [=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")