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

有些情况下,同一端点的两个消费者希望得到两种不同的反应。spring-doc.cadn.net.cn

这种方法还能让你立即知道哪个消费者使用了API的哪个部分。 你可以删除API生成的部分响应,看看你自动生成的测试是哪一个 失败。如果都不行,你可以安全地删除回复中的那部分,因为没人用。

请考虑以下为生产者定义的合同示例,名为制作人, 该有两个消费者(foo-consumer棒-消费者):spring-doc.cadn.net.cn

消费者FOO-服务
request {
   url '/foo'
   method GET()
}
response {
    status OK()
    body(
       foo: "foo"
    }
}
消费者酒吧服务
request {
   url '/bar'
   method GET()
}
response {
    status OK()
    body(
       bar: "bar"
    }
}

你不能对同一个请求产生两个不同的回复。这就是为什么你可以正确打包 合同并从中获利小作品 PerConsumer特征。spring-doc.cadn.net.cn

在生产方,消费者可以有一个只与他们相关的合同文件夹。 通过设置spring.cloud.contract.stubrunner.stubs-per-consumer旗帜变为true,我们不再注册所有存根,只注册那些 对应于消费者应用程序的名称。换句话说,我们扫描每个存根和的路径, 如果它包含路径中消费者名称的子文件夹,只有在那时才会被注册。spring-doc.cadn.net.cn

制作方合同大概是这样的spring-doc.cadn.net.cn

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

棒-消费者消费者可以选择设置spring.application.name或者spring.cloud.contract.stubrunner.consumer-name棒-消费者或者,你也可以将测试设置如下:spring-doc.cadn.net.cn

@SpringBootTest(classes = Config, properties = ["spring.application.name=bar-consumer",
		"spring.cloud.contract.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")
@Disabled("TODO: Sth wrong with stream?")
class StubRunnerStubsPerConsumerSpec {
...
}

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

你也可以明确设置消费者名称,具体如下:spring-doc.cadn.net.cn

@SpringBootTest(classes = Config, properties = "spring.cloud.contract.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")
@Disabled("TODO: Sth wrong with stream?")
class StubRunnerStubsPerConsumerWithConsumerNameSpec {
...
}

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

关于这一变化背后的原因, 参见第224期spring-doc.cadn.net.cn