Spring Cloud Contract и два сервиса, которые являются как производителями, так и потребителями - PullRequest
0 голосов
/ 27 мая 2018

TL; DR: как создать заглушки для двух служб, которые обмениваются информацией (следовательно, оба являются производителями и потребителями)?

Привет,

Я занимаюсь разработкой приложения с использованием архитектуры микросервисов сmaven, Spring Boot, Spring Cloud Stream, с Spring Cloud Contract Verifier и Stub Runner для интеграционных тестов.Я использую источник событий для публикации событий через Кафку.Итак, у меня есть что-то вроде этого:

my-app
|-- pom.xml (sets up both subprojects as children)
|-- person-service (handles person's money)
|  |-- src/main/java/person/EventProducer.java (produces a personCreated event)
|  `-- src/main/java/person/EventConsumer.java (consumes an objectBought event)
`-- object-service (handles objects that can be bought)
   |-- src/main/java/object/EventProducer.java (produces an objectBought event)
   `-- src/main/java/object/EventConsumer.java (consumes a personCreated event)

Теперь моя проблема в том, что с Event Sourcing обе услуги являются производителями и потребителями.Итак, у меня есть обе службы, генерирующие заглушки для другой службы, например:

тесты интеграции человек-сервис

@SpringBootTest(classes = PersonApplication.class, webEnvironment = RANDOM_PORT)
@AutoConfigureStubRunner(ids = "example.com:object-service", stubsMode = LOCAL)
class PersonIntegrationTests extends Specification {
    @Inject StubTrigger stubTrigger
    // tests
}

интеграция объект-сервисtests

@SpringBootTest(classes = ObjectApplication.class, webEnvironment = RANDOM_PORT)
@AutoConfigureStubRunner(ids = "com.example:person-service", stubsMode = LOCAL)
class ObjectIntegrationTests extends Specification {
    @Inject StubTrigger stubTrigger
    // tests
}

Теперь, конечно, выполнение mvn clean install в родительском проекте выдает ошибку, потому что независимо от порядка сборки заглушки в другом проекте еще не были сгенерированы.

Я просмотрел документацию Spring Cloud Contract Verifier и ее примеры, но я не нашел решения для этого сценария.

Прямо сейчас в качестве обходного пути я сначала запускаю mvn clean install -DskipTests длясначала создайте заглушки, а затем mvn clean install, чтобы запустить все тесты.Я также попытался настроить проект внешних контрактов, который могли бы использовать обе службы, но каждая служба по-прежнему генерирует свои собственные заглушки.Я думаю, что изменение stubsMode на CLASSPATH также не помогло бы, поскольку заглушки все равно нужно было бы создавать в первую очередь ...

Хотя я и создавал "службу заглушек", которая реализовывала бы производителей каждого из них.сервис, так что каждый проект будет ссылаться на него для заглушек (поэтому я буду использовать ids = "com.example:stub-service" в каждом интеграционном тесте).Но это кажется хлопотным и может привести к человеческим ошибкам, поскольку каждое изменение в контракте и каждая дополнительная публикация службы в хранилище событий должна отражаться в службе-заглушке.

Мой вопрос: есть лилучший способ создания заглушек для обоих проектов перед выполнением моих интеграционных тестов?Я хотел бы иметь возможность создавать и запускать интеграционные тесты, используя только mvn clean install.

1 Ответ

0 голосов
/ 27 мая 2018

Это очень хороший вопрос.Это проблема типа курицы и яйца.

В настоящее время в качестве обходного пути я сначала запускаю mvn clean install -DskipTests, чтобы сначала создать заглушки, а затем mvn clean install, чтобы запустить все тесты.Я также попытался настроить проект внешних контрактов, который могли бы использовать обе службы, но каждая служба все еще генерирует свои собственные заглушки

Это кажется очень разумным.Вы также можете поместить некоторые тесты в другой набор и сначала запустить тесты с одним профилем (например, producer), а затем другим (например, consumer).Но то, что вы сделали, кажется самым быстрым.

Вы можете подать проблему в Spring Cloud Contract, и мы можем попытаться выяснить, как сделать жизнь разработчика проще в таких случаях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...