消费者驱动的合同:每个消费者的存根

在某些情况下,同一终结点的两个使用者希望有两个不同的响应。spring-doc.cadn.net.cn

这种方法还可以让您立即知道哪个消费者使用了 API 的哪个部分。 您可以删除 API 生成的部分响应,并查看自动生成的测试 失败。如果没有失败,您可以安全地删除响应的该部分,因为没有人使用它。

考虑以下为生产者定义的名为producer, 它有两个消费者 (foo-consumerbar-consumer):spring-doc.cadn.net.cn

消费者foo-service
request {
   url '/foo'
   method GET()
}
response {
    status OK()
    body(
       foo: "foo"
    }
}
消费者bar-service
request {
   url '/bar'
   method GET()
}
response {
    status OK()
    body(
       bar: "bar"
    }
}

不能为同一请求生成两个不同的响应。这就是为什么您可以正确打包 合约,然后从stubsPerConsumer特征。spring-doc.cadn.net.cn

在生产者端,使用者可以有一个文件夹,其中包含仅与他们相关的协定。 通过设置stubrunner.stubs-per-consumerflag 到true,我们不再注册所有存根,而只注册那些 对应于使用者应用程序的名称。换句话说,我们扫描每个存根的路径, 如果它在路径中包含具有消费者名称的子文件夹,则仅注册它。spring-doc.cadn.net.cn

foo生产者方合同将如下所示spring-doc.cadn.net.cn

.
└── contracts
    ├── bar-consumer
    │   ├── bookReturnedForBar.groovy
    │   └── shouldCallBar.groovy
    └── foo-consumer
        ├── bookReturnedForFoo.groovy
        └── shouldCallFoo.groovy

bar-consumer消费者可以将spring.application.namestubrunner.consumer-namebar-consumer或者,您可以按如下方式设置测试:spring-doc.cadn.net.cn

@SpringBootTest(classes = Config, properties = ["spring.application.name=bar-consumer",
		"stubrunner.jms.enabled=false"])
@AutoConfigureStubRunner(ids = "org.springframework.cloud.contract.verifier.stubs:producerWithMultipleConsumers",
		repositoryRoot = "classpath:m2repo/repository/",
		stubsMode = StubRunnerProperties.StubsMode.REMOTE,
		stubsPerConsumer = true)
@ActiveProfiles("streamconsumer")
class StubRunnerStubsPerConsumerSpec {
...
}

然后,只有在包含以下内容的路径下注册的存根bar-consumer在其名称中(即来自src/test/resources/contracts/bar-consumer/some/contracts/…​文件夹)被允许引用。spring-doc.cadn.net.cn

您还可以显式设置消费者名称,如下所示:spring-doc.cadn.net.cn

@SpringBootTest(classes = Config, properties = "stubrunner.jms.enabled=false")
@AutoConfigureStubRunner(ids = "org.springframework.cloud.contract.verifier.stubs:producerWithMultipleConsumers",
        repositoryRoot = "classpath:m2repo/repository/",
        consumerName = "foo-consumer",
        stubsMode = StubRunnerProperties.StubsMode.REMOTE,
        stubsPerConsumer = true)
@ActiveProfiles("streamconsumer")
class StubRunnerStubsPerConsumerWithConsumerNameSpec {
...
}

然后,只有在包含foo-consumer在其名称中(即来自src/test/resources/contracts/foo-consumer/some/contracts/…​文件夹)被允许引用。spring-doc.cadn.net.cn

有关此更改背后原因的更多信息, 见第224期spring-doc.cadn.net.cn