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
.