2017-01-28 2 views
5

Краткое содержание выпуска: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, третий терпит неудачу: enter image description here enter image description here

Вы заметите, тесты названы так, что он навязывает определенный порядок выполнения, которая имеет отношение, потому что третий тест завершается неудачно, если он выполняется ПОСЛЕ второго. И он терпит неудачу, потому что получил ответ от второй реализации ClientInterface, , хотя третий тест НЕ использует профиль client-impl-two.

Что я сделал/обнаружил до сих пор:

  • иногда работает ./mvnw clean test также имеет те же результаты ошибок, но я был не в состоянии обеспечить воспроизводимый пример
  • контекст Spring приложения является правильно загружена весной/весной загрузки
  • Spring Boot правильно вводит номер порта, а остальной клиент в тестах всегда вызывает экземпляр REST, он должен быть
  • только когда Resteasy берет на себя запрос, что он каким-то образом загружает неправильный экземпляр приложения, и, следовательно, используется неправильный контекст Spring Application, поэтому он дает неверный ответ
    • это я понял сохраняя точку останова в SpringResourceFactory.createResource() где это просто querynig в beanFactory для компонента ресурсов, и призывая beanFactory.getBean(ClientInterface.class) видеть, реализация которых идет вверх, и это было неправильно один для третьего испытания
  • во время тестов, существует более одного экземпляра приложения, каждый по своему собственному по rt, который, как я полагаю, имеет отношение к проблеме
  • есть другая ветка, jersey-instead-of-resteasy, в которой Джерси используется как реализация JAX-RS, и где тесты успешны независимо от того, запущены они с IntelliJ или с Maven
  • есть DebugFilter, с помощью которого я проверяю, что представляет собой контекст приложения Spring, прежде чем запрос будет передан сервлетом Resteasy, и он всегда правильный (загружается правильная реализация ClientInterface), независимо от того, как тест выполняется
    • Это только при запуске третьего теста, и когда запрос достигает Resteasy, загружается неправильный экземпляр приложения, как указано в один из перечисленных выше пунктов

Основываясь на приведенных выше пунктов, у меня есть сильное подозрение, Resteasy может быть проблемой.

Любая помощь очень ценится.

ответ

1

Я отлаживал это немного, и я считаю, что отказ вызван ошибкой в ​​resteasy-spring-boot-starter. Я только что создал проблему с github и предоставил PR [2], который исправляет это и выполняет ваш тест. Я также комментирую [3]. Престижность отличного описания и воспроизведения.

  1. https://github.com/paypal/resteasy-spring-boot/issues/51
  2. https://github.com/paypal/resteasy-spring-boot/pull/52
  3. https://issues.jboss.org/browse/RESTEASY-1595
+0

Я проверил решение при условии, и это работает! Я награду награду, как только Stackoverflow позволит мне :)) –

+1

Привет. Габриэль благодарит за сообщение о проблеме. И @AlessioSoldano благодарит за его исправление. Я выпущу новую версию RESTEasy Spring Boot startter с исправлением. – Fabio

+2

Версия 2.2.2-RELEASE только что была выпущена с исправлением. – Fabio

Смежные вопросы