Люди говорят мне А и Б, Они говорят мне, как я должен видеть, То, что я видел, уже ясно, поэтому они толкают меня потом из стороны в сторону (Я хочу выйти — Helloween)
Разработка приложения, использующего
веб-API RESTful,
может подразумевать разработку на стороне сервера и клиента. Написание интеграционных тестов для серверной части может быть таким же простым, как использование
Arquillian
для запуска сервера и
REST-гарантия,
чтобы проверить, что сервисы работают должным образом. Проблема в том, как проверить клиентскую сторону. В этом посте мы увидим, как протестировать клиентскую сторону, кроме использования макетов.
В качестве краткого описания, для тестирования клиентской стороны нам нужен локальный сервер, который может возвращать записанные
ответы JSON .
Остальное-клиент-драйвер представляет собой библиотеку , которая имитирует
RESTful службы. Вы можете установить ожидания для
HTTP- запросов, которые вы хотите получить во время теста. Так что это именно то, что нам нужно для нашей стороны Java-клиента. Обратите внимание, что этот проект действительно полезен для написания тестов при разработке
веб-клиентов RESTful для подключения к сервисам, разработанным сторонними разработчиками, такими как
Flickr Rest API ,
Jira Rest API ,
Github …
Первое, что нужно сделать, это добавить
зависимость rest-client-driver :
<dependency> <groupId>com.github.rest-driver</groupId> <artifactId>rest-client-driver</artifactId> <version>1.1.27</version> <scope>test</scope> </dependency>
Следующим шагом мы собираемся создать очень простое
приложение на Джерси,
которое просто вызывает метод get для требуемого
URI.
public class GithubClient { private static final int HTTP_STATUS_CODE_OK = 200; private String githubBaseUri; public GithubClient(String githubBaseUri) { this.githubBaseUri = githubBaseUri; } public String invokeGetMethod(String resourceName) { Client client = Client.create(); WebResource webResource = client.resource(githubBaseUri+resourceName); ClientResponse response = webResource.type("application/json") .accept("application/json").get(ClientResponse.class); int statusCode = response.getStatus(); if(statusCode != HTTP_STATUS_CODE_OK) { throw new IllegalStateException("Error code "+statusCode); } return response.getEntity(String.class); } }
И теперь мы хотим проверить, что
invokeGetMethod действительно получает требуемый ресурс. Предположим, что этот метод в рабочем коде будет отвечать за получение имени всех проблем из проекта, зарегистрированного на
github .
Теперь мы можем начать писать тест:
@Rule public ClientDriverRule driver = new ClientDriverRule(); @Test public void issues_from_project_should_be_retrieved() { driver.addExpectation( onRequestTo("/repos/lordofthejars/nosqlunit/issues"). withMethod(Method.GET), giveResponse(GET_RESPONSE)); GithubClient githubClient = new GithubClient(driver.getBaseUrl()); String issues = githubClient.invokeGetMethod("/repos/lordofthejars/nosqlunit/issues"); assertThat(issues, is(GET_RESPONSE)); }
- Мы используем ClientDriverRule @Rule аннотации добавить клиентский драйвер для тестирования.
- И затем, используя методы, предоставленные классом RestClientDriver , ожидания записываются.
- Посмотрите, как мы устанавливаем базовый URL с помощью driver.getBaseUrl ()
С помощью
rest-client-driver мы также можем записать ответ о статусе http, используя
метод giveEmptyResponse :
@Test(expected=IllegalStateException.class) public void http_errors_should_throw_an_exception() { driver.addExpectation( onRequestTo("/repos/lordofthejars/nosqlunit/issues") .withMethod(Method.GET), giveEmptyResponse().withStatus(401)); GithubClient githubClient = new GithubClient(driver.getBaseUrl()); githubClient.invokeGetMethod("/repos/lordofthejars/nosqlunit/issues"); }
И, очевидно, мы можем записать положенное действие:
Обратите внимание, что в этом примере мы устанавливаем, что наш запрос должен содержать данное тело сообщения для ответа с кодом состояния 204.
Это очень простой пример, но имейте в виду , что также работает с библиотеками , как
gson или
Джексоном . Кроме того,
проект rest-driver поставляется с модулем, который можно использовать для подтверждения ответов сервера (например,
проект с гарантированным REST ), но эта тема будет рассмотрена в другом посте.
Я желаю, чтобы вы нашли этот пост полезным.
Мы продолжаем учиться,
Алекс.