1. введение
Эта статья представляет собой краткое введение в аннотацию @RestClientTest .
Новая аннотация помогает упростить и ускорить тестирование клиентов REST в приложениях Spring.
2. Поддержка клиентов REST в Spring Boot Pre-1.4
Spring Boot-это удобная платформа, которая предоставляет множество автоматически настроенных компонентов Spring с типичными настройками, которые позволяют вам меньше концентрироваться на конфигурации приложения Spring и больше на вашем коде и бизнес-логике.
Но в версии 1.3 мы не получаем большой помощи, когда хотим создать или протестировать клиентов служб REST. Его поддержка клиентов REST не очень глубока.
Для создания клиента для REST API обычно используется экземпляр RestTemplate . Обычно он должен быть настроен перед использованием, и его конфигурация может отличаться, поэтому Spring Boot не предоставляет универсально настроенных RestTemplate bean.
То же самое касается тестирования клиентов 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
Самые новые версии выпуска можно найти здесь .
3.2. Rest TemplateBuilder
Spring Boot приносит как автоконфигурированный Rest TemplateBuilder для упрощения создания Тестовых шаблонов , так и соответствующую @RestClientTest аннотацию для тестирования клиентов, построенных с помощью RestTemplateBuilder . Вот как вы можете создать простой клиент REST с помощью Rest TemplateBuilder auto-injected для вас:
@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); } }
Обратите внимание, что мы явно не связали экземпляр Rest TemplateBuilder с конструктором. Это возможно благодаря новой функции Spring, называемой неявной инъекцией конструктора, которая обсуждается в этой статье .
Rest TemplateBuilder предоставляет удобные методы для регистрации преобразователей сообщений, обработчиков ошибок, обработчиков шаблонов URI, базовой авторизации, а также использования любых дополнительных настроек, которые вам нужны.
3.3. @RestClientTest
Для тестирования такого клиента REST , построенного с помощью Rest TemplateBuilder , вы можете использовать Spring Runner -выполняемый тестовый класс с аннотацией @RestClientTest . Эта аннотация отключает полную автоматическую настройку и применяет конфигурацию, относящуюся только к тестам клиента REST, т. Е. автоконфигурацию Джексона или GSON и @JsonComponent beans, но не к обычным @Component beans.
@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"); } }
Во-первых, нам нужно убедиться, что этот тест выполняется с Spring Runner , добавив @RunWith(SpringRunner.class) аннотация.
Итак, что нового?
Во-первых – аннотация @RestClientTest позволяет нам указать точную тестируемую службу – в нашем случае это класс DetailsServiceClient . Эта служба будет загружена в контекст тестирования, в то время как все остальное будет отфильтровано.
Это позволяет нам автоматически подключать экземпляр Details Service Client внутри нашего теста и оставлять все остальное снаружи, что ускоряет загрузку контекста.
Во – вторых – поскольку экземпляр MockRestServiceServer также настроен для @RestClientTest -аннотированного теста (и привязан к экземпляру DetailsServiceClient для нас), мы можем просто ввести его и использовать.
Наконец, поддержка – JSON для @RestClientTest позволяет нам ввести экземпляр ObjectMapper Джексона для подготовки значения MockRestServiceServer mock answer.
Все, что осталось сделать, это выполнить вызов нашей службы и проверить результаты.
4. Заключение
В этой статье мы обсудили новую аннотацию @RestClientTest , которая позволяет легко и быстро тестировать клиенты REST, созданные с помощью Spring.
Исходный код статьи доступен на GitHub .