1.介绍

春云合同简单地说,这个项目能帮助我们写作吗消费者驱动的契约(CDC)

这保证了双方的合同生产商和一个消费者用于基于http和基于消息的交互。

在这篇快速文章中,我们将探讨如何通过HTTP交互为Spring Cloud Contract编写生产者和消费者端测试用例。

2.生产者-服务器端

我们要写一个制作人方的疾控中心,形式是EvenOddController它告诉我们是否数量参数为偶数或奇数:

@RequestParam(“number”)public String isNumberPrime(@RequestParam(“number”)Integer number) {return Integer. parseint(“number”)% 2 == 0 ?“甚至”:“奇怪”;}}

2.1。Maven的依赖关系

对于我们生产方,我们需要spring-cloud-starter-contract-verifier依赖:

<依赖> < groupId > org.springframework。云< / groupId > < artifactId > spring-cloud-starter-contract-verifier < / artifactId > <版本> 2.1.1。版本< / > < >范围测试范围< / > < / >的依赖

我们需要进行配置spring-cloud-contract-maven-plugin使用基测试类的名称,我们将在下一节中描述:

<插件> < groupId > org.springframework。云< / groupId > < artifactId > spring-cloud-contract-maven-plugin < / artifactId > <版本> 2.1.1。RELEASE true   com.金宝搏188体育baeldung.spring.cloud. springcloudcontractproduct.basetestclass   

2.2。生产者端设置

我们需要在加载Spring上下文的测试包中添加一个基类:

@RunWith(springruner .class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK) @DirtiesContext @AutoConfigureMessageVerifier公共类BaseTestClass {@Autowired私有EvenOddController EvenOddController;@Before public void setup() {StandaloneMockMvcBuilder StandaloneMockMvcBuilder = MockMvcBuilders.standaloneSetup(evenOddController);RestAssuredMockMvc.standaloneSetup (standaloneMockMvcBuilder);}}

/ / src /测试/资源/合同包,我们将添加测试存根,例如文件中的这个shouldReturnEvenWhenRequestParamIsEven.groovy:

进口org.springframework.cloud.contract.spec.Contract合同。make {description "should return even when number input is even" request{method GET() url("/validate/prime-number") {queryParameters {parameter("number", "2")}}} response {body(" even") status 200}}

当我们运行构建时,插件自动生成一个名为ContractVerifierTest扩展我们的BaseTestClass把它放进去/ /目标/ generated-test-sources /合同

测试方法的名称来源于前缀“validate_”与我们的Groovy测试存根的名称连接。对于上面的Groovy文件,生成的方法名将是“validate_shouldReturnEvenWhenRequestParamIsEven”

让我们看看这个自动生成的测试类:

public class contractverfiertest extends BaseTestClass {@Test public void validate_shouldreturnvenwhenrequestparamiseven () throws Exception{//给定:MockMvcRequestSpecification请求=给定();//当:ResponseOptions response = given().spec(request) .queryParam("number","2") .get("/validate/prime-number");/ /然后:为了(response.statusCode ()) .isEqualTo (200);//和:String responseBody = response.getBody().asString();为了(responseBody) .isEqualTo(“甚至”);}

构建还将在本地Maven存储库中添加存根jar,以便用户可以使用它。

存根将出现在下面的输出文件夹中存根/地图/

3.消费者-客户端

我们CDC的消费者端将使用生产者端生成的存根通过HTTP交互来维护契约,所以制作方的任何变动都将违反合同

我们将添加BasicMathController,它将发出一个HTTP请求,从生成的存根中获取响应:

@RestController public class BasicMathController {@Autowired private RestTemplate;@GetMapping("/calculate") public String checkOddAndEven(@RequestParam("number") Integer number) {HttpHeaders HttpHeaders = new HttpHeaders();httpHeaders。add(“内容类型”、“application / json”);响应实体响应实体= restTemplate。交易所(" http://localhost: 8090 /验证/质数?+ number, HttpMethod。GET, new HttpEntity<>(httpHeaders), String.class);返回responseEntity.getBody ();}}

3.1。Maven的依赖关系

对于我们的消费者,我们需要添加spring-cloud-contract-wiremockspring-cloud-contract-stub-runner依赖关系:

<依赖> < groupId > org.springframework。云< / groupId > < artifactId > spring-cloud-contract-wiremock < / artifactId > <版本> 2.1.1。版本< / > < >范围测试范围< / > < / >的依赖<依赖> < groupId > org.springframework。云< / groupId > < artifactId > spring-cloud-contract-stub-runner < / artifactId > <版本> 2.1.1。版本< / > < >范围测试范围< / > < / >的依赖

3.2。消费者方面的设置

现在是时候配置我们的存根运行器了,它将通知我们的消费者我们本地Maven存储库中可用的存根:

@AutoConfigureMockMvc @AutoConfigureJsonTesters @AutoConfigureStubRunner(stubsMode = StubRunnerProperties.StubsMode.)本地,id = "com.baeld金宝搏188体育ung.spring.cloud:spring-cloud-contract-producer:+:stub:8090")公共类BasicMathControllerIntegrationTest {@Autowired私有MockMvc MockMvc;@Test public void given_WhenPassEvenNumberInQueryParam_ThenReturnEven()抛出异常{mockmvcrequestbuilder .get("/calculate?number=2") .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(content().string("Even"));}}

请注意,id财产的@AutoConfigureStubRunner注释指定:

  • com.金宝搏188体育baeldung.spring.cloud- - -groupId我们的工件
  • spring-cloud-contract-producer- - -artifactId生产者存根罐
  • 8090-生成的存根将运行的端口

4.当合同被打破

如果我们在生产者方面做了任何直接影响合约而不更新消费者方面的更改,这可能导致合同失败。

例如,假设我们要更改EvenOddController请求URI/验证/更改/质数在我们的生产方。

如果我们没有将此更改通知消费者,消费者仍然会将其请求发送给/验证/质数URI,而消费者端测试用例将抛出org.springframework.web.client.HttpClientErrorException: 404 Not Found

5.总结

我们已经看到Spring Cloud Contract如何帮助我们维护服务消费者和生产者之间的契约,这样我们就可以推出新代码,而不必担心破坏契约。

和往常一样,可以找到本教程的完整实现在GitHub

通用的底部

开始使用Spring 5和Spring Boot 2,通过学习的春天课程:

>>看看这个课程
2评论
最古老的
最新的
内联反馈
查看所有评论
对这篇文章的评论关闭!