java - Spring Cloud Contract 和两个既是生产者又是消费者的服务

标签 java maven spring-cloud-stream spring-cloud-contract

TL;DR:如何为交换信息的两个服务(因此都是生产者和消费者)生成 stub ?

嗨,

我正在开发一个使用微服务架构的应用程序,其中包括 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)

现在,我的问题是,对于事件溯源,两个服务都是生产者和消费者。因此,我让两个服务生成 stub 以供另一个服务使用,如下所示:

人员服务集成测试

@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 会出现错误,因为无论构建顺序如何,其他项目中的 stub 尚未生成。

我查看了 Spring Cloud Contract Verifier 文档及其示例,但尚未找到针对此场景的解决方案。

现在,作为解决方法,我首先运行 mvn clean install -DskipTests 来生成 stub ,然后运行 ​​mvn clean install 来运行所有测试。我还尝试设置两个服务都可以使用的外部契约(Contract)项目,但每个服务仍然生成自己的 stub 。我认为将 StubsMode 更改为 CLASSPATH 也无济于事,因为仍然需要首先创建 stub ...

我想创建一个“ stub 服务”来实现每个服务的生产者,以便每个项目都会引用它来获取 stub (所以我会使用 ids = "com.example:stub-每个集成测试中的服务”)。但这似乎很麻烦,并且可能会导致人为错误,因为契约(Contract)中的每个更改以及事件存储中发布的每个附加服务都需要反射(reflect)在 stub 服务中。

我的问题是:在运行集成测试之前,是否有更好的方法来生成两个项目的 stub ?我希望能够仅使用 mvn clean install 构建和运行集成测试。

最佳答案

这是一个非常好的问题。这是一个先有鸡还是先有蛋的问题。

Right now as a workaround I run first mvn clean install -DskipTests to generate the stubs first, then mvn clean install to run all tests. I've also tried setting up an external contracts project that both services could use, but each service still generates its own stubs

这看起来很有道理。您还可以将一些测试放在不同的套件中,首先使用一个配置文件(例如生产者)运行测试,然后使用另一个配置文件(例如消费者)运行测试。但你所做的似乎是最快的。

您可以在 Spring Cloud Contract 中提出问题,我们可以尝试研究如何在这种情况下让开发人员的工作变得更轻松。

关于java - Spring Cloud Contract 和两个既是生产者又是消费者的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50546972/

相关文章:

java - @Async 在 Spring Boot 应用程序中给我错误

Java BlockingQueue take() 在 while 循环中

maven - 在 Intellij idea ultimate2017.2 中运行 maven webapp 时出错 : Caused by: java. lang.NoClassDefFoundError: Lorg/slf4j/Logger

java - 支持为 Spring Cloud Stream 绑定(bind)中的每个消费者绑定(bind)定义 spring.json.key.type

spring-cloud - ServiceActivator 或 StreamListener 用法

java - Spring Boot Controller 测试,空指针异常

java - Android 无法对 SD 卡进行写入和删除操作

java - Maven 未运行测试

java - woodstox 无法离线工作

java - Spring Schema 注册表服务器和 MySQL