1. Введение
Эта статья представляет собой краткое введение в аннотацию @RestClientTest
.
Новая аннотация помогает упростить и ускорить тестирование клиентов REST в ваших приложениях Spring.
2. Поддержка клиента REST в Spring Boot до версии 1.4
Spring Boot — это удобный фреймворк, который предоставляет множество автоматически настраиваемых компонентов Spring с типичными настройками, которые позволяют вам меньше концентрироваться на настройке приложения Spring и больше — на своем коде и бизнес-логике.
Но в версии 1.3 мы не получаем много помощи, когда хотим создать или протестировать клиентов служб REST. Его поддержка клиентов REST не очень глубока.
Для создания клиента для REST API обычно используется экземпляр RestTemplate .
Обычно его необходимо настроить перед использованием, и его конфигурация может различаться, поэтому Spring Boot не предоставляет универсально настроенного bean-компонента RestTemplate
.
То же самое касается тестирования клиентов REST. До Spring Boot 1.4.0 процедура тестирования клиента Spring REST не сильно отличалась от процедуры тестирования любого другого приложения на основе Spring. Вы должны создать экземпляр MockRestServiceServer
, привязать его к тестируемому экземпляру RestTemplate
и предоставить ему фиктивные ответы на запросы, например:
RestTemplate restTemplate = new RestTemplate();
MockRestServiceServer mockServer =
MockRestServiceServer.bindTo(restTemplate).build();
mockServer.expect(requestTo("/greeting"))
.andRespond(withSuccess());
// Test code that uses the above RestTemplate ...
mockServer.verify();
Вам также придется инициализировать контейнер Spring и убедиться, что в контекст загружаются только необходимые компоненты, чтобы ускорить время загрузки контекста (и, следовательно, время выполнения теста).
3. Новые функции клиента REST в Spring Boot 1.4+
В Spring Boot 1.4 команда приложила все усилия, чтобы упростить и ускорить создание и тестирование клиентов REST.
Итак, давайте проверим новые функции.
3.1. Добавление Spring Boot в ваш проект
Во-первых, вам нужно убедиться, что ваш проект использует Spring Boot 1.4.x или выше:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
Последние версии релизов можно найти здесь .
3.2. RestTemplateBuilder
Spring Boot предоставляет как автоматически настроенный RestTemplateBuilder
для упрощения создания RestTemplates
, так и соответствующую аннотацию @RestClientTest
для тестирования клиентов, созданных с помощью RestTemplateBuilder
. Вот как вы можете создать простой REST-клиент с автоматически внедряемым RestTemplateBuilder
:
@Service
public class DetailsServiceClient {
private final RestTemplate restTemplate;
public DetailsServiceClient(RestTemplateBuilder restTemplateBuilder) {
restTemplate = restTemplateBuilder.build();
}
public Details getUserDetails(String name) {
return restTemplate.getForObject("/{name}/details",
Details.class, name);
}
}
Обратите внимание, что мы не связывали явно экземпляр RestTemplateBuilder
с конструктором. Это возможно благодаря новой фиче Spring под названием неявное внедрение конструктора, которая обсуждается в этой статье .
RestTemplateBuilder
предоставляет удобные методы для регистрации конвертеров сообщений, обработчиков ошибок, обработчиков шаблонов URI, базовой авторизации, а также использует любые дополнительные настройщики, которые вам нужны.
3.3. @RestClientTest
Для тестирования такого REST-клиента, созданного с помощью RestTemplateBuilder
, вы можете использовать исполняемый SpringRunner
тестовый класс с аннотацией @RestClientTest
. Эта аннотация отключает полную автоматическую настройку и применяет только конфигурацию, относящуюся к клиентским тестам REST, т. е. автоконфигурацию Jackson или GSON и компоненты @JsonComponent
, но не обычные компоненты @Component
.
@RestClientTest
гарантирует автоматическую настройку поддержки Jackson и GSON, а также добавляет в контекст предварительно настроенные экземпляры RestTemplateBuilder
и MockRestServiceServer
. Тестируемый компонент указывается с помощью атрибута value
или component аннотации
@RestClientTest
:
@RunWith(SpringRunner.class)
@RestClientTest(DetailsServiceClient.class)
public class DetailsServiceClientTest {
@Autowired
private DetailsServiceClient client;
@Autowired
private MockRestServiceServer server;
@Autowired
private ObjectMapper objectMapper;
@Before
public void setUp() throws Exception {
String detailsString =
objectMapper.writeValueAsString(new Details("John Smith", "john"));
this.server.expect(requestTo("/john/details"))
.andRespond(withSuccess(detailsString, MediaType.APPLICATION_JSON));
}
@Test
public void whenCallingGetUserDetails_thenClientMakesCorrectCall()
throws Exception {
Details details = this.client.getUserDetails("john");
assertThat(details.getLogin()).isEqualTo("john");
assertThat(details.getName()).isEqualTo("John Smith");
}
}
Во-первых, нам нужно убедиться, что этот тест выполняется с помощью SpringRunner
, добавив аннотацию @RunWith(SpringRunner.class)
.
Так что нового?
** Во - первых , аннотация ** @RestClientTest
позволяет указать конкретный тестируемый сервис — в нашем случае это класс DetailsServiceClient
. Этот сервис будет загружен в тестовый контекст, а все остальное будет отфильтровано.
Это позволяет нам автоматически подключать экземпляр DetailsServiceClient
внутри нашего теста и оставлять все остальное снаружи, что ускоряет загрузку контекста.
Во- вторых , поскольку экземпляр MockRestServiceServer
также настроен для аннотированного теста @RestClientTest
(и привязан к экземпляру DetailsServiceClient
для нас), мы можем просто внедрить его и использовать.
Наконец , поддержка JSON для @RestClientTest
позволяет нам внедрить экземпляр ObjectMapper Джексона, чтобы подготовить значение
фиктивного ответа MockRestServiceServer .
Все, что осталось сделать, это выполнить вызов нашего сервиса и проверить результаты.
4. Вывод
В этой статье мы обсудили новую аннотацию @RestClientTest
, которая позволяет легко и быстро тестировать REST-клиенты, созданные с помощью Spring.
Исходный код статьи доступен на GitHub .