В качестве краткого описания, для тестирования клиентской части нам нужен локальный сервер, который может возвращать записанные ответы JSON . Rest-client-driver — это библиотека, которая имитирует службу RESTful . Вы можете установить ожидания для HTTP- запросов, которые вы хотите получить во время теста. Так что это именно то, что нам нужно для нашей стороны Java-клиента. Обратите внимание, что этот проект действительно полезен для написания тестов при разработке веб-клиентов RESTful для подключения к сервисам, разработанным сторонними разработчиками, такими как Flickr Rest API , Jira Rest API , Github …
Первое, что нужно сделать, это добавить зависимость rest-client-driver :
|
1
2
3
4
5
6
|
<dependency> <groupId>com.github.rest-driver<groupId> <artifactId>rest-client-driver<artifactId> <version>1.1.27<version> <scope>test<scope><dependency> |
Следующим шагом мы собираемся создать очень простое приложение на Джерси, которое просто вызывает метод get для требуемого URI.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
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('applicationjson') .accept('applicationjson').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 .
Теперь мы можем начать писать тест:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
@Rulepublic ClientDriverRule driver = new ClientDriverRule();@Testpublic void issues_from_project_should_be_retrieved() { driver.addExpectation( onRequestTo('reposlordofthejarsnosqlunitissues'). withMethod(Method.GET), giveResponse(GET_RESPONSE)); GithubClient githubClient = new GithubClient(driver.getBaseUrl()); String issues = githubClient.invokeGetMethod('reposlordofthejarsnosqlunitissues'); assertThat(issues, is(GET_RESPONSE)); } |
- Мы используем аннотацию ClientDriverRule @Rule для добавления клиента-драйвера в тест.
- И затем, используя методы, предоставленные классом RestClientDriver , ожидания записываются.
- Посмотрите, как мы устанавливаем базовый URL с помощью driver.getBaseUrl ()
С помощью rest-client-driver мы также можем записать ответ о статусе http, используя метод giveEmptyResponse :
|
01
02
03
04
05
06
07
08
09
10
11
|
@Test(expected=IllegalStateException.class)public void http_errors_should_throw_an_exception() { driver.addExpectation( onRequestTo('reposlordofthejarsnosqlunitissues') .withMethod(Method.GET), giveEmptyResponse().withStatus(401)); GithubClient githubClient = new GithubClient(driver.getBaseUrl()); githubClient.invokeGetMethod('reposlordofthejarsnosqlunitissues');} |
И, очевидно, мы можем записать положенное действие:
|
1
2
3
|
driver.addExpectation( onRequestTo('reposlordofthejarsnosqlunitissues'). .withMethod(Method.PUT).withBody(PUT_MESSAGE, 'applicationjson'), giveEmptyResponse().withStatus(204)); |
Обратите внимание, что в этом примере мы устанавливаем, что наш запрос должен содержать данное тело сообщения для ответа с кодом состояния 204.
Это очень простой пример, но имейте в виду, что он также работает с такими библиотеками, как gson или jackson . Кроме того, проект rest-driver поставляется с модулем, который можно использовать для подтверждения ответов сервера (например, проект с гарантированным REST ), но эта тема будет рассмотрена в другом посте.
Ссылка: тестирование клиентской части услуг RESTful от нашего партнера JCG Алекса Сото в блоге One Jar To Rule All .