The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:
Недавно я объяснил, что такое свободный Java HTTP-клиент, созданный (в основном) для более объектно-ориентированных HTTP-взаимодействий, чем с другими доступными клиентами, включая: Apache Client, Jersey Client и обычный HttpURLConnection
.
Этот клиент поставляется в Maven-артефакте jcabi-http. Однако, клиентская часть - не единственное преимущество использования jcabi-http. Jcabi также включает компонент сервера, который может помочь вам в модульном и интеграционном тестировании ваших HTTP-клиентов.
Давайте сначала рассмотрим пример. В этом примере я использую hamcrest для проверок.
Теперь давайте узнаем, что здесь происходит.
В первых нескольких строках я создаю экземпляр MkContainer
, который буквально имеет четыре метода: next(MkAnswer)
, start()
, stop()
и home()
.
Он работает как HTTP-сервер с очередью “первым пришел - первым обслужен”. Мы добавляем ответы, и сервер возвращает их в ответ на HTTP-запросы.
Сервер запускается при вызове start()
и останавливается при вызове stop()
. Его метод home()
возвращает URL его “домашней страницы”. Затем сервер привязывается к случайно назначенному порту TCP.
Контейнер находит первый доступный и не занятый порт.
В приведенном выше примере я добавил только один ответ. Это означает, что контейнер будет отвечать только на первый HTTP-запрос с этим ответом, и все последующие запросы вызовут HTTP-ответы со статусом “внутренняя ошибка сервера 500.”
В строках с 5 по 8 я делаю HTTP-запрос к уже запущенному серверу. Также я делаю утверждение, что тело HTTP-ответа содержит текст "hello"
. Очевидно, что это утверждение будет выполнено, потому что сервер вернет "hello, world!"
в ответ на мой первый запрос.
Как вы можете видеть, я использую container.home()
для получения URL-адреса сервера. Рекомендуется разрешить контейнеру найти первый свободный порт TCP и привязаться к нему. Тем не менее, если вам нужно указать свой собственный порт, вы можете сделать это с помощью одноаргументного метода start(int)
в MkContainer
.
Я использую try/finally
для безопасной остановки контейнера. В модульных тестах это не критично, так как вы можете упростить свой код и никогда не останавливать контейнер. Кроме того, контейнер будет уничтожен вместе с JVM. Однако ради ясности я рекомендую вам останавливать контейнер в блоке finally
.
На строке 12 я прошу остановленный контейнер предоставить мне первый полученный им запрос. Этот механизм концептуально подобен технологии “проверка” фреймворков для мокирования. Например, Mockito.
Экземпляр MkQuery
предоставляет информацию о выполненном запросе. В этом примере я получаю все заголовки HTTP-запроса и проверяю, что заголовок "User-Agent"
присутствует и имеет хотя бы одно значение, равное "Myself"
.
Эта технология мокирования активно используется в модульных и интеграционных тестах jcabi-github, который является клиентом на языке Java для API GitHub. В процессе его разработки эта технология является очень важной для проверки, какие запросы отправляются на сервер, и проверки их соответствия нашим требованиям. Здесь мы используем мокирование jcabi-http.
Как и с клиентом, вам понадобится зависимость jcabi-http.jar
(получите последние версии на Maven Central).
Кроме вышеупомянутого, вам необходимо добавить еще одну зависимость, которая является сервером Grizzly HTTP. MkGrizzlyContainer
строится на его основе.
Если у вас возникли вопросы или предложения, пожалуйста, отправьте их через GitHub issues. Как всегда, ошибки приветствуются.
Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-18 at 05:05