@SpringBootTest мешает динамическому переплетению EclipseLink
Моя компания разрабатывает веб-приложение с использованием Spring Boot, Spring MVC, JPA с EclipseLink и динамического ткачества. Моя задача - подготовить реализацию пользовательского интерфейса и интеграционных тестов, раскрутить приложение с помощью JUnit и @SpringBootTest и взаимодействовать с ним с помощью Selenium.
Как указано в Spring Boot Testing Features, тесты с использованием @SpringBootApplication
аннотация может использовать @MockBean
аннотация для определения Mockito mocks для bean-компонентов в ApplicationContext. Это достигается путем регистрации BeanFactoryPostProcessor
, MockitoPostProcessor
, рекурсивно сканирующие классы с пометкой @Component
или же @Configuration
для классов и полей с пометкой @MockBean
,
К сожалению, это приводит к тому, что классы сущностей, на которые есть ссылки в этих классах, загружаются до LocalContainerEntityManagerFactoryBean
то, что должно сканировать их, создается и устанавливается с LoadTimeWeaver
, что приводит к пропуску времени загрузки для этих объектов. Это ведет к NoSuchMethodException
s для методов, созданных ткачеством, как _persistence_propertyChange()
когда настойчивые действия выполнены.
Можно ли использовать @SpringBootTest
с EclipseLink и динамическим переплетением? Если нет, что было бы хорошей альтернативой для настройки интеграционного теста для последней версии Spring Boot?
1 ответ
Я решил проблему с помощью кастома SpringApplicationRunListener
"s contextPrepared()
удалить проблемный BeanFactoryPostProcessor
с из ApplicationContext
до того, как они были казнены весной.
Мы столкнулись с той же проблемой в веб-приложении, созданном с помощью Spring Boot 2.1.6 и EclipseLink 2.7.6.
Можно ли использовать @SpringBootTest с EclipseLink и динамическим переплетением? Если нет, что было бы хорошей альтернативой настройке интеграционного теста для последней версии Spring Boot?
Решением было установить eclipselink.weaving
JPA собственности на false
в @SpringBootTest
, и чтобы 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:
@TestPropertySource(properties = "jpa.eclipselink.weaving=false")