Как я могу выполнить операцию WireMock.verify () на заглушке Spring Cloud Contract?

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


person Michael Telewicz    schedule 22.01.2020    source источник


Ответы (1)


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

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

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

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

person Marcin Grzejszczak    schedule 22.01.2020
comment
На самом деле я настолько незнаком с WireMock, что даже не подумал попробовать это. Я просто пробовал то, что читал в документации WireMock, в основном вызывая WireMock.verify (), вообще не создавая экземпляра. Я попробую и доложу. Спасибо! - person Michael Telewicz; 24.01.2020
comment
Это действительно было решение. Я очень ценю вашу помощь. Это сводит меня с ума. Спасибо! - person Michael Telewicz; 24.01.2020
comment
Если вы заинтересованы в участии в Spring Cloud Contract, возможно, вы захотите добавить раздел документации о том, как проверить заглушку? - person Marcin Grzejszczak; 24.01.2020
comment
Конечно, я думаю, это меньшее, что я могу сделать. - person Michael Telewicz; 24.01.2020