【发布时间】:2018-11-05 21:39:25
【问题描述】:
TL;DR:如何为交换信息的两个服务生成存根(因此它们都是生产者和消费者)?
嗨,
我正在使用带有 maven、Spring Boot、Spring Cloud Stream、Spring Cloud Contract Verifier 和 Stub Runner 的微服务架构开发一个应用程序,用于集成测试。我正在使用事件溯源通过 Kafka 发布事件。所以我有这样的事情:
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)
现在,我的问题是,对于事件溯源,两种服务都是生产者和消费者。所以我有两个服务生成存根供另一个服务使用,如下所示:
个人服务集成测试
@SpringBootTest(classes = PersonApplication.class, webEnvironment = RANDOM_PORT)
@AutoConfigureStubRunner(ids = "example.com:object-service", stubsMode = LOCAL)
class PersonIntegrationTests extends Specification {
@Inject StubTrigger stubTrigger
// 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")。但这似乎很麻烦,并且可能导致人为错误,因为合同的每次更改以及在 Event Store 中发布的每个附加服务都需要反映在存根服务中。
我的问题是:在运行我的集成测试之前,有没有更好的方法来为两个项目生成存根?我希望能够仅使用 mvn clean install 构建和运行集成测试。
【问题讨论】:
标签: java maven spring-cloud-stream spring-cloud-contract