Можна використовувати тести на стороні клієнта для тестування коду, який внутрішньо використовує
RestTemplate
. Ідея полягає в оголошенні очікуваних запитів та наданні "відповідей-заглушок", щоб можна
було зосередитися на тестуванні коду в ізольованому середовищі (тобто без запуску сервера). У цьому прикладі
показано, як це зробити:
RestTemplate restTemplate = new RestTemplate();
MockRestServiceServer mockServer = MockRestServiceServer.bindTo(restTemplate).build();
mockServer.expect(requestTo("/greeting")).andRespond(withSuccess());
// Тестовий код, який використовує вищезгаданий RestTemplate ...
mockServer.verify();
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
:
server = MockRestServiceServer.bindTo(restTemplate).ignoreExpectOrder(true).build();
server = MockRestServiceServer.bindTo(restTemplate).ignoreExpectOrder(true).build()
Навіть у разі невпорядкованих запитів за замовчуванням кожен запит дозволяється виконувати лише один раз. Метод
expect
надає перевантажений варіант, який приймає аргумент ExpectedCount
, що задає
діапазон підрахунку (наприклад, once
, manyTimes
, max
, min
,
between
тощо). У цьому прикладі використовується діапазон times
:
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();
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
. Це дозволяє обробляти запити, використовуючи реальну логіку за сервера, але не запуску
сервера. У цьому прикладі показано, як це зробити:
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
this.restTemplate = New RestTemplate(New MockMvcClientHttpRequestFactory(mockMvc));
// Тестовий код, який використовує вищезгаданий RestTemplate ...
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 на стороні клієнта.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ