Для 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()));
}
}
Ссылки: