Mocking of HTTP Server in Java

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

sixnines availability badge   GitHub stars