«1. Обзор

В этой статье рассматривается Spring Boot TestRestTemplate. Его можно рассматривать как продолжение Руководства по RestTemplate, которое мы настоятельно рекомендуем прочитать, прежде чем сосредоточиться на TestRestTemplate. TestRestTemplate можно рассматривать как привлекательную альтернативу RestTemplate.

2. Зависимости Maven

Для использования TestRestTemplate у вас должна быть соответствующая зависимость, например:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-test</artifactId>
    <version>2.2.2.RELEASE</version>
</dependency>

Вы можете найти последнюю версию на Maven Central.

3. TestRestTemplate и RestTemplate

Оба этих клиента вполне подходят для написания интеграционных тестов и могут очень хорошо работать с HTTP API.

Например, они предоставляют нам те же самые методы, стандартные методы, заголовки и другие конструкции HTTP.

И все эти операции хорошо описаны в Руководстве по RestTemplate, поэтому мы не будем возвращаться к ним здесь.

Вот простой пример GET-запроса:

TestRestTemplate testRestTemplate = new TestRestTemplate();
ResponseEntity<String> response = testRestTemplate.
  getForEntity(FOO_RESOURCE_URL + "/1", String.class);
 
assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));

Несмотря на то, что оба класса очень похожи, TestRestTemplate не расширяет RestTemplate и предлагает несколько очень интересных новых функций.

4. Что нового в TestRestTemplate?

4.1. Конструктор с учетными данными базовой аутентификации

TestRestTemplate предоставляет конструктор, с помощью которого мы можем создать шаблон с указанными учетными данными для базовой аутентификации.

Все запросы, выполняемые с использованием этого экземпляра, будут аутентифицироваться с использованием предоставленных учетных данных:

TestRestTemplate testRestTemplate
 = new TestRestTemplate("user", "passwd");
ResponseEntity<String> response = testRestTemplate.
  getForEntity(URL_SECURED_BY_AUTHENTICATION, String.class);
 
assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));

4.2. Конструктор с HttpClientOption

TestRestTemplate также позволяет нам настроить базовый HTTP-клиент Apache с помощью HttpClientOption, который является перечислением в TestRestTemplate со следующими параметрами: ENABLE_COOKIES, ENABLE_REDIRECTS и SSL.

Давайте рассмотрим краткий пример:

TestRestTemplate testRestTemplate = new TestRestTemplate("user", 
  "passwd", TestRestTemplate.HttpClientOption.ENABLE_COOKIES);
ResponseEntity<String> response = testRestTemplate.
  getForEntity(URL_SECURED_BY_AUTHENTICATION, String.class);
 
assertThat(response.getStatusCode(), equalTo(HttpStatus.OK))

В приведенном выше примере мы используем параметры вместе с базовой аутентификацией.

Если нам не нужна аутентификация, мы все равно можем создать шаблон с помощью простого конструктора:

TestRestTemplate(TestRestTemplate.HttpClientOption.ENABLE_COOKIES)

4.3. Новый метод

Не только конструкторы могут создавать шаблон с указанными учетными данными. Мы также можем добавить учетные данные после создания нашего шаблона. TestRestTemplate дает нам метод withBasicAuth(), который добавляет учетные данные к уже существующему шаблону:

TestRestTemplate testRestTemplate = new TestRestTemplate();
ResponseEntity<String> response = testRestTemplate.withBasicAuth(
  "user", "passwd").getForEntity(URL_SECURED_BY_AUTHENTICATION, 
  String.class);
 
assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));

5. Использование как TestRestTemplate, так и RestTemplate

TestRestTemplate может работать как оболочка для RestTemplate, например. если мы вынуждены использовать его, потому что имеем дело с устаревшим кодом. Ниже показано, как создать такую ​​простую обертку:

RestTemplateBuilder restTemplateBuilder = new RestTemplateBuilder();
restTemplateBuilder.configure(restTemplate);
TestRestTemplate testRestTemplate = new TestRestTemplate(restTemplateBuilder);
ResponseEntity<String> response = testRestTemplate.getForEntity(
  FOO_RESOURCE_URL + "/1", String.class);
 
assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));

6. Заключение

TestRestTemplate не является расширением RestTemplate, а скорее альтернативой, упрощающей интеграционное тестирование и облегчающей аутентификацию во время тестов. Это помогает в настройке HTTP-клиента Apache, но также может использоваться в качестве оболочки RestTemplate.

Вы можете ознакомиться с примерами, представленными в этой статье, на GitHub.