Перейти к основному содержимому

Изучение Spring Boot TestRestTemplate

· 3 мин. чтения

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);

Assertions.assertEquals(response.getStatusCode(), 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);

Assertions.assertEquals(response.getStatusCode(), 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);

Assertions.assertEquals(response.getStatusCode(), 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);

Assertions.assertEquals(response.getStatusCode(), 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);

Assertions.assertEquals(response.getStatusCode(), HttpStatus.OK);

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

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

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