Для unit тестов хватает Mockito (ссылки в конце заметки).
Но, допустим, я хочу провести интеграционный тест своего сервиса, который взаимодействует через REST с другим сервисом.
Пример такой связки: frontend с Wicket обращается к backend. Нужно протестировать frontend с Wicket.
Может быть есть возможность запустить сторонний сервис (backend) с какими-то тестовыми данными. Можно написать простенький (или не очень) эмулятор этого другого сервиса. А можно использовать WireMock. Из ссылок в конце заметки должно быть все понятно. Далее просто описание примера.
1. Запуск wiremock (https://wiremock.org/docs/standalone/):
java -jar wiremock-standalone-3.12.1.jar SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. /$$ /$$ /$$ /$$ /$$ /$$ | $$ /$ | $$|__/ | $$$ /$$$ | $$ | $$ /$$$| $$ /$$ /$$$$$$ /$$$$$$ | $$$$ /$$$$ /$$$$$$ /$$$$$$$| $$ /$$ | $$/$$ $$ $$| $$ /$$__ $$ /$$__ $$| $$ $$/$$ $$ /$$__ $$ /$$_____/| $$ /$$/ | $$$$_ $$$$| $$| $$ \__/| $$$$$$$$| $$ $$$| $$| $$ \ $$| $$ | $$$$$$/ | $$$/ \ $$$| $$| $$ | $$_____/| $$\ $ | $$| $$ | $$| $$ | $$_ $$ | $$/ \ $$| $$| $$ | $$$$$$$| $$ \/ | $$| $$$$$$/| $$$$$$$| $$ \ $$ |__/ \__/|__/|__/ \_______/|__/ |__/ \______/ \_______/|__/ \__/ port: 8080 enable-browser-proxying: false disable-banner: false no-request-journal: false verbose: false
wiremock-standalone-3.12.1.jar из https://wiremock.org/docs/standalone/
2. Настройка ответов wiremock (собственно сама настройка эмулятора):
через curl:
При HTTP GET запросе на http://localhost:8080/get/this ответить "Here it is!".
$ curl -X POST \ --data '{ "request": { "url": "/get/this", "method": "GET" }, "response": { "status": 200, "body": "Here it is!\n" }}' \ http://localhost:8080/__admin/mappings
Ответ:
{ "id" : "378e5f51-dce2-4b22-9c43-9a6453fceecc", "request" : { "url" : "/get/this", "method" : "GET" }, "response" : { "status" : 200, "body" : "Here it is!\n" }, "uuid" : "378e5f51-dce2-4b22-9c43-9a6453fceecc"
Проверка с curl:
$ curl http://localhost:8080/get/this Here it is!
В схеме интеграционного BDD тестирования "Given-When-Then" можно использовать в "Given".
Есть возможность настройки и проведения теста с помощью java кода (https://wiremock.org/docs/junit-jupiter/):
public class ProgrammaticWireMockTest { @RegisterExtension static WireMockExtension wm1 = WireMockExtension.newInstance() .options(wireMockConfig().dynamicPort().dynamicHttpsPort()) .build(); @RegisterExtension static WireMockExtension wm2 = WireMockExtension.newInstance() .options(wireMockConfig() .dynamicPort() .extensions(new ResponseTemplateTransformer( getTemplateEngine(), options.getResponseTemplatingGlobal(), getFiles(), templateModelProviders ) ) .build(); @Test void test_something_with_wiremock() { // You can get ports, base URL etc. via WireMockRuntimeInfo WireMockRuntimeInfo wm1RuntimeInfo = wm1.getRuntimeInfo(); int httpsPort = wm1RuntimeInfo.getHttpsPort(); // or directly via the extension field int httpPort = wm1.port(); // You can use the DSL directly from the extension field wm1.stubFor(get("/api-1-thing").willReturn(ok())); wm2.stubFor(get("/api-2-stuff").willReturn(ok())); } }
Ссылки: