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

在某些情况下,同一端点的两个消费者需要两种不同的响应。

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

考虑以下为名为 producer 的生产者定义的契约示例,它有两个消费者(foo-consumerbar-consumer

消费者 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.cloud.contract.stubrunner.stubs-per-consumer 标志设置为 true,我们不再注册所有存根,而只注册与消费者应用程序名称对应的存根。换句话说,我们扫描每个存根的路径,如果路径中包含一个以消费者名称命名的子文件夹,那么才注册它。

foo 生产者端,契约将如下所示

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

bar-consumer 消费者可以将 spring.application.namespring.cloud.contract.stubrunner.consumer-name 设置为 bar-consumer 另外,您可以按如下方式设置测试

@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 {
...
}

那么只有在路径中包含 bar-consumer 的名称(即来自 src/test/resources/contracts/bar-consumer/some/contracts/…​ 文件夹)下注册的存根才允许被引用。

您也可以明确设置消费者名称,如下所示

@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/…​ 文件夹)下注册的存根才允许被引用。

有关此更改背后的更多信息,请参阅 issue 224

© . This site is unofficial and not affiliated with VMware.