Как я могу выполнить операцию WireMock.verify () для заглушки Spring Cloud Contract? - PullRequest
0 голосов
/ 22 января 2020

Я пишу набор микросервисов с использованием 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, но я не уверен, как это сделать. Я пытался найти какую-то информацию в документах, но по общему признанию потерян. Буду очень признателен за любую помощь!

1 Ответ

0 голосов
/ 22 января 2020

Интересно ...

Если вы используете динамические c порты, вы можете попытаться получить URI для данной заглушки либо с помощью @StubRunnerPort("myConsumer") int stubPort, либо с помощью правила-заглушки или расширения заглушки. а затем позвоните new WireMock("localhost", stubPort).verifyThat(...).

Поскольку у вас есть порт * 654 * stati c, вы говорите, что выполнение `new WireMock (" localhost ", 6565) .verifyThat (...) у вас не работает?

Вы можете проверить пример здесь https://github.com/spring-cloud/spring-cloud-contract/issues/457

...