Я пишу набор микросервисов с использованием Spring Boot, и мне нужно запустить несколько интеграционных тестов в стиле BDD, которые проверяют каждый из них независимо от другого. Чтобы понять, как это сделать, я написал очень простой контракт с использованием Spring Cloud Contract для одного из производителей. Вот:
org.springframework.cloud.contract.spec.Contract.make {
description("Contract for the command endpoint where a consumer can send the service individual commands")
name("CommandEndpoint")
request {
method 'POST'
urlPath('/myendpoint')
headers {
contentType(applicationJson())
}
body(["rootId" : "1234", "reportId" : "7ea6bfba-ec22-4a53-b6e9-9261ee459b69"])
}
response {
status OK()
}
}
Со стороны потребителя у меня нормально работает заглушка. Я использую Cucumber в своих интеграционных тестах, поэтому я настроил бегун так:
@RunWith(Cucumber.class)
@CucumberOptions(features= {"src/test/resources/features"},
glue = {"bdd/stepDefinitions"},
dryRun = false)
public class CucumberRunnerIT {
}
И я настраиваю контекст приложения Spring следующим образом:
@SpringBootTest(webEnvironment=WebEnvironment.NONE, classes = { BddConfig.class })
@AutoConfigureStubRunner(ids = {"com.blah.consumer:my-consumer:0.0.48:stubs:6565"},
stubsMode = StubRunnerProperties.StubsMode.LOCAL)
public class SpringContextLoader {
private static final Logger LOGGER = LogManager.getLogger(SpringContextLoader.class);
@Before
public void setUp() {
LOGGER.info("LOADING SPRING CONTEXT");
}
}
Когда я указываю своему потребителю на http://localhost:6565, он отлично отправляет запрос - я вижу, что заглушка получает это в выводе консоли. Однако сейчас я хочу сделать что-то вроде операции WireMock.verify (). Я хочу, чтобы мой интеграционный тест подтвердил, что заглушка получила запрос на правильную конечную точку с правильным телом запроса. Однако, когда я пытаюсь просто сделать:
verify(postRequestedFor(urlEqualTo("/myendpoint")));
Я получаю эту ошибку после довольно продолжительной задержки:
com.github.tomakehurst.wiremock.common.JsonException: {
"errors" : [ {
"code" : 10,
"source" : {
"pointer" : "/timestamp"
},
"title" : "Error parsing JSON",
"detail" : "Unrecognized field \"timestamp\" (class com.github.tomakehurst.wiremock.common.Errors), not marked as ignorable"
} ]
}
at com.github.tomakehurst.wiremock.common.JsonException.fromJackson(JsonException.java:49)
at com.github.tomakehurst.wiremock.common.Json.read(Json.java:52)
at com.github.tomakehurst.wiremock.client.HttpAdminClient.safelyExecuteRequest(HttpAdminClient.java:449)
at com.github.tomakehurst.wiremock.client.HttpAdminClient.postJsonAssertOkAndReturnBody(HttpAdminClient.java:383)
at com.github.tomakehurst.wiremock.client.HttpAdminClient.countRequestsMatching(HttpAdminClient.java:222)
at com.github.tomakehurst.wiremock.client.WireMock.verifyThat(WireMock.java:526)
at com.github.tomakehurst.wiremock.client.WireMock.verifyThat(WireMock.java:511)
at com.github.tomakehurst.wiremock.client.WireMock.verify(WireMock.java:549)
at bdd.stepDefinitions.VerificationToIrsSteps.i_validate_the_outcomes(VerificationToIrsSteps.java:33)
at ✽.I validate the outcomes(src/test/resources/features/VerificationToIrs.feature:25)
Я предполагаю, что мне нужно сделать еще несколько настроек, чтобы использовать WireMock в сочетании с Spring Cloud Contract, но я не уверен, как это сделать. Я попытался найти некоторую информацию в документации, но, по общему признанию, потерялся. Буду очень признателен за любую помощь!