Краткое содержание выпуска:Resteasy-Спринг: некорректный пример приложение загружается во время тестов с несколькими экземплярами погонных
Я написал простой интерфейс REST HTTP, построенный с Spring ботинке, который возвращает простой текст ответа при вызове GET /app
, основанный на реализации ClientInterface
, из которых 2. Возможности REST реализованы с использованием JAX-RS, обеспечиваемого рестайлингом через RestEasy-SpringBoot library.
Я также написал 3 теста, из которых третий не удается, потому что ответ приходит от второй реализации ClientInterface
вместо первой реализации, потому что (я предполагаю) Resteasy является смешение экземпляров приложения, и, следовательно, загружается неправильный контекст Spring Application с неправильными компонентами.
ПРИМЕЧАНИЕ: вы можете найти пример приложения here, который включает в себя документацию, а
пожалуйста, посмотрите на исходный код, чтобы получить четкую картину. Он также занимал бы слишком много места для вставки кода.
Дальнейшие детали:
Есть 2 реализаций ClientInterface
, которые обеспечивают ответ заданную REST ресурса. Они переключаются с использованием профиля client-impl-two
. Если профиль отсутствует, используется первая реализация, если она присутствует, используется вторая.
The первого и третьих испытаний ожидать ответ от первого осуществления, а второй теста ожидает ответ от реализации секунд, потому что она использует client-two-impl
профиля.
Когда я запускать тесты с помощью интеграции JUnit из IntelliJ, третий терпит неудачу:
Вы заметите, тесты названы так, что он навязывает определенный порядок выполнения, которая имеет отношение, потому что третий тест завершается неудачно, если он выполняется ПОСЛЕ второго. И он терпит неудачу, потому что получил ответ от второй реализации ClientInterface
, , хотя третий тест НЕ использует профиль client-impl-two
.
Что я сделал/обнаружил до сих пор:
- иногда работает
./mvnw clean test
также имеет те же результаты ошибок, но я был не в состоянии обеспечить воспроизводимый пример - контекст Spring приложения является правильно загружена весной/весной загрузки
- Spring Boot правильно вводит номер порта, а остальной клиент в тестах всегда вызывает экземпляр REST, он должен быть
- только когда Resteasy берет на себя запрос, что он каким-то образом загружает неправильный экземпляр приложения, и, следовательно, используется неправильный контекст Spring Application, поэтому он дает неверный ответ
- это я понял сохраняя точку останова в SpringResourceFactory.createResource() где это просто querynig в
beanFactory
для компонента ресурсов, и призываяbeanFactory.getBean(ClientInterface.class)
видеть, реализация которых идет вверх, и это было неправильно один для третьего испытания
- это я понял сохраняя точку останова в SpringResourceFactory.createResource() где это просто querynig в
- во время тестов, существует более одного экземпляра приложения, каждый по своему собственному по rt, который, как я полагаю, имеет отношение к проблеме
- есть другая ветка,
jersey-instead-of-resteasy
, в которой Джерси используется как реализация JAX-RS, и где тесты успешны независимо от того, запущены они с IntelliJ или с Maven - есть
DebugFilter
, с помощью которого я проверяю, что представляет собой контекст приложения Spring, прежде чем запрос будет передан сервлетом Resteasy, и он всегда правильный (загружается правильная реализацияClientInterface
), независимо от того, как тест выполняется- Это только при запуске третьего теста, и когда запрос достигает Resteasy, загружается неправильный экземпляр приложения, как указано в один из перечисленных выше пунктов
Основываясь на приведенных выше пунктов, у меня есть сильное подозрение, Resteasy может быть проблемой.
Любая помощь очень ценится.
Я проверил решение при условии, и это работает! Я награду награду, как только Stackoverflow позволит мне :)) –
Привет. Габриэль благодарит за сообщение о проблеме. И @AlessioSoldano благодарит за его исправление. Я выпущу новую версию RESTEasy Spring Boot startter с исправлением. – Fabio
Версия 2.2.2-RELEASE только что была выпущена с исправлением. – Fabio