Краткое руководство по @RestClientTest в Spring Boot

Краткое руководство по @RestClientTest в Spring Boot

1. Вступление

Эта статья представляет собой краткое введение в аннотацию@RestClientTest.

Новая аннотация помогает упростить и ускорить тестирование клиентов REST в ваших приложениях Spring.

2. Поддержка клиентов REST в Spring Boot Pre-1.4

Spring Boot - это удобная инфраструктура, которая предоставляет множество автоматически настраиваемых bean-компонентов 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 или выше:


    org.springframework.boot
    spring-boot-starter-parent
     

    
        org.springframework.boot
        spring-boot-starter-web
    
    
        org.springframework.boot
        spring-boot-starter-test
        test
    

Последние версии релизов можно найтиhere.

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, называемой неявной инъекцией конструктора, которая обсуждается вthis article.

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

3.3. @RestClientTestс

Для тестирования такого REST-клиента, созданного с помощьюRestTemplateBuilder, вы можете использовать тестовый класс, выполняемыйSpringRunner, аннотированный@RestClientTest. Эта аннотация отключает полную автоконфигурацию и применяет только конфигурацию, относящуюся к тестам клиента REST, т.е. Автоматическая настройка Jackson или GSON и bean-компоненты@JsonComponent, но не обычные bean-компоненты@Component.

@RestClientTest обеспечивает автоматическую настройку поддержки Jackson и GSON, а также добавляет в контекст предварительно настроенные экземплярыRestTemplateBuilder иMockRestServiceServer. Тестируемый компонент указывается с помощью атрибутаvalue илиcomponents аннотации@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).

Так что нового?

First - аннотация@RestClientTest позволяет нам указать точную тестируемую службу - в нашем случае это классDetailsServiceClient. Этот сервис будет загружен в тестовый контекст, а все остальное отфильтровано.

Это позволяет нам автоматически подключать экземплярDetailsServiceClient внутри нашего теста и оставлять все остальное снаружи, что ускоряет загрузку контекста.

Second - поскольку экземплярMockRestServiceServer также настроен для тестирования с аннотациями@RestClientTest (и привязан к экземпляруDetailsServiceClient для нас), мы можем просто ввести его и использовать.

Finally - поддержка JSON для@RestClientTest позволяет нам внедрить экземплярObjectMapper Джексона для подготовки значения фиктивного ответаMockRestServiceServer’s.

Все, что осталось сделать, - это выполнить вызов нашей службы и проверить результаты.

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

В этой статье мы обсудили новую аннотацию@RestClientTest, которая позволяет легко и быстро тестировать клиенты REST, созданные с помощью Spring.

Исходный код статьи доступенon GitHub.