@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, что приводит к пропуску времени загрузки для этих объектов. Это ведет к NoSuchMethodExceptions для методов, созданных ткачеством, как _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")
Другие вопросы по тегам