Можна використовувати тести на стороні клієнта для тестування коду, який внутрішньо використовує RestTemplate. Ідея полягає в оголошенні очікуваних запитів та наданні "відповідей-заглушок", щоб можна було зосередитися на тестуванні коду в ізольованому середовищі (тобто без запуску сервера). У цьому прикладі показано, як це зробити:

Java
RestTemplate restTemplate = new RestTemplate();
MockRestServiceServer mockServer = MockRestServiceServer.bindTo(restTemplate).build();
mockServer.expect(requestTo("/greeting")).andRespond(withSuccess());
// Тестовий код, який використовує вищезгаданий RestTemplate ...
mockServer.verify();
Kotlin
val restTemplate = RestTemplate()
val mockServer = MockRestServiceServer.bindTo(restTemplate).build()
mockServer.expect(requestTo("/greeting")).andRespond(withSuccess())
// Тестовий код, який використовує вищезгаданий RestTemplate ...
mockServer.verify()

У попередньому прикладі MockRestServiceServer (центральний клас для тестів REST на стороні клієнта) конфігурує RestTemplate за допомогою спеціального ClientHttpRequestFactory, який підтверджує відповідність реальних запитів очікуваним подіям та повертає "відповіді-заглушки". У цьому випадку ми очікуємо на запит /greeting і хочемо повернути відповідь 200 з вмістом text/plain. За потреби можна визначити додаткові очікувані запити та відповіді-заглушки. Якщо ми визначаємо очікувані запити та відповіді-заглушки, RestTemplate можна використовувати в коді на стороні клієнта звичайним чином. Наприкінці тестування можна використовувати mockServer.verify(), щоб переконатися, що всі очікувані події відбулися.

За замовчуванням запити очікуються в порядку, в якому були оголошені очікувані події. Можна встановити опцію ignoreExpectOrder під час створення сервера, і в цьому випадку всі очікувані події будуть перевірені (по порядку), щоб знайти відповідність для зазначеного запиту. Це означає, що запити можуть надходити у будь-якому порядку. У цьому прикладі використовується ignoreExpectOrder:

Java
server = MockRestServiceServer.bindTo(restTemplate).ignoreExpectOrder(true).build();
Kotlin
server = MockRestServiceServer.bindTo(restTemplate).ignoreExpectOrder(true).build()

Навіть у разі невпорядкованих запитів за замовчуванням кожен запит дозволяється виконувати лише один раз. Метод expect надає перевантажений варіант, який приймає аргумент ExpectedCount, що задає діапазон підрахунку (наприклад, once, manyTimes, max, min, between тощо). У цьому прикладі використовується діапазон times:

Java
RestTemplate restTemplate = new RestTemplate();
MockRestServiceServer mockServer = MockRestServiceServer.bindTo(restTemplate).build();
mockServer.expect(times(2), requestTo("/something")).andRespond(withSuccess());
mockServer.expect(times(3), requestTo("/somewhere")).andRespond(withSuccess());
// ...
mockServer.verify();
Kotlin
val restTemplate = RestTemplate()
val mockServer = MockRestServiceServer.bindTo(restTemplate).build()
mockServer.expect(times(2), requestTo("/something")).andRespond(withSuccess())
mockServer.expect(times(3), requestTo("/somewhere")).andRespond(withSuccess())
// ...
mockServer.verify()

Зверни увагу, що якщо ignoreExpectOrder не встановлено (за замовчуванням), і, отже, запити очікуються у порядку оголошення, то цей порядок застосовується лише до першого з очікуваних запитів. Наприклад, якщо "/something" очікується двічі, а потім "/somewhere" три рази, то запит до "/something" повинен надходити перед запитом до "/somewhere", але, крім цих наступних "/something" та "/somewhere" ", запити можуть надходити у будь-який момент.

Як альтернативу всьому перерахованому вище, функція підтримки тестування на стороні клієнта також надає реалізацію ClientHttpRequestFactory, яку можна налаштувати в RestTemplate для прив'язки до екземпляра MockMvc. Це дозволяє обробляти запити, використовуючи реальну логіку за сервера, але не запуску сервера. У цьому прикладі показано, як це зробити:

Java
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
this.restTemplate = New RestTemplate(New MockMvcClientHttpRequestFactory(mockMvc));
// Тестовий код, який використовує вищезгаданий RestTemplate ...
Kotlin
val mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build()
restTemplate = RestTemplate(MockMvcClientHttpRequestFactory(mockMvc))
// Тестовий код, який використовує вищезгаданий RestTemplate ...

Статичне імпортування

Як і у випадку з тестами на стороні сервера, текучий API-інтерфейс для тестів на стороні клієнта вимагає деяких статичних елементів, що імпортуються. Їх легко знайти за допомогою пошуку за MockRest*. Користувачам Eclipse потрібно додати MockRestRequestMatchers.* і MockRestResponseCreators.* як "вибрані статичні члени" в налаштуваннях Eclipse в розділі Java → Editor → Content Assist → Favorites. Це дозволить використовувати автозавершення (content assist) після введення першого символу імені статичного методу. Інші IDE (наприклад, IntelliJ) можуть не вимагати додаткового налаштування. Перевір підтримку автозавершення коду для статичних членів.

Інші приклади тестів REST на стороні клієнта

Власні тести Spring MVC Test включають приклади тестів REST на стороні клієнта.