Тестирование Springboot с брокером - PullRequest
0 голосов
/ 16 марта 2020

У меня есть пакт-брокер, работающий в облаке AWS. Я вижу некоторое описание, в котором говорится, что "пакт между app-a-service и app-b-service" в некотором примере URL, например, demo.service. aws .cloud / demo-service / latest "показывает взаимодействия. ответ на брокере:

A pact between express-demo-service and spring-demo-service
Requests from express-demo-service to spring-demo-service

Get test envs given tEST_ENV and SECRET_ENV set
Interactions

Given tEST_ENV and SECRET_ENV set, upon receiving get test envs from express-demo-service, with

{
  "method": "GET",
  "path": "/env",
  "headers": {
    "Authorization": "Bearer "
  }
}
spring-demo-service will respond with:

{
  "status": 200,
  "headers": {
    "Content-Type": "application/json"
  },
  "body": {
    "TEST_ENV": "foo",
    "SECRET_ENV": "bar"
  }
}

Теперь я создаю свой контроллер остатка Springboot, который возвращает этот ответ, как определено в документации. Как теперь запустить тест, чтобы убедиться, что моя реализация соответствует этим требованиям от брокера pact?

Ниже приведены мои TestPacts, чтобы убедиться, что мои реализации соответствуют контракту от брокера (не уверен, что это правильно):

@RunWith(PactRunner.class)
@Provider("test_provider" )
@PactBroker(host = "https://mybroker.aws.com/pacts/provider/spring-demo-service/consumer/express-demo-service/latest", port = "80")
@VerificationReports({"console", "markdown"})
public class TestPacts {
    private static final Logger LOG = LoggerFactory.getLogger(TestPacts.class);

    private static ConfigurableApplicationContext application;

    @TestTarget
    public final Target target = new HttpTarget(8080);

    @BeforeClass
    public static void startSpring(){
        LOG.info("starting application");
        application = SpringApplication.run(ProviderServiceApplication.class);
    }

    @State("default")
    public void toDefaultState() {
        LOG.info("Now service in default state");
    }

    @State("extra")
    public void toExtraState() {
        LOG.info("Now service in extra state");
    }

    @AfterClass
    public static void kill(){
        LOG.info("stop application");
        application.stop();
    }
}

Когда я запускаю, я получаю ошибку:

org.junit.runners.model.InitializationError
    at au.com.dius.pact.provider.junit.PactRunner.initialize(PactRunner.kt:93)
    at au.com.dius.pact.provider.junit.PactRunner.getChildren(PactRunner.kt:140)
    at org.junit.runners.ParentRunner.getFilteredChildren(ParentRunner.java:426)
    at org.junit.runners.ParentRunner.getDescription(ParentRunner.java:351)
    at com.intellij.junit4.JUnit4IdeaTestRunner.getDescription(JUnit4IdeaTestRunner.java:78)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:50)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
    at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
    at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

Попробуйте использовать:

@PactBroker(host = "mybroker.aws.com", scheme = "https", port = "443")

Существует атрибут схемы для выбора http или https. Схема по умолчанию равна http, так как вы используете https, вы должны изменить его на https.

0 голосов
/ 17 марта 2020

Я думаю, что проблема может заключаться в том, что вы указываете полный путь к файлу pact, а не просто передаете хост

, т.е.

@PactBroker(host = "https://mybroker.aws.com/pacts/provider/spring-demo-service/consumer/express-demo-service/latest", port = "80")

должно быть

@PactBroker(host = "https://mybroker.aws.com", port = "443")

Также порт мне кажется неправильным. Необычно, что защищенная конечная точка TLS будет работать на порту 80 - это более вероятно 443.

...