使用RestDocs生成Contracts

优质
小牛编辑
138浏览
2023-12-01

可以使用Spring RestDocs生成的另一件事是Spring Cloud Contract DSL文件和文档。如果您将其与Spring Cloud WireMock相结合,那么您将获得合同和存根。

提示您可能会想知道为什么该功能在WireMock模块中。来想一想,它确实有道理,因为只生成合同并且不生成存根就没有意义。这就是为什么我们建议做这两个。

我们来想象下面的测试:

		this.mockMvc.perform(post("/foo")
					.accept(MediaType.APPLICATION_PDF)
					.accept(MediaType.APPLICATION_JSON)
					.contentType(MediaType.APPLICATION_JSON)
					.content("{\"foo\": 23 }"))
				.andExpect(status().isOk())
				.andExpect(content().string("bar"))
				// first WireMock
				.andDo(WireMockRestDocs.verify()
						.jsonPath("$[?(@.foo >= 20)]")
						.contentType(MediaType.valueOf("application/json"))
						.stub("shouldGrantABeerIfOldEnough"))
				// then Contract DSL documentation
				.andDo(document("index", SpringCloudContractRestDocs.dslContract()));

这将导致在上一节中介绍的存根的创建,合同将被生成和文档文件。

合同将被称为index.groovy,看起来更像是这样。

import org.springframework.cloud.contract.spec.Contract
Contract.make {
  request {
    method 'POST'
    url 'http://localhost:8080/foo'
    body('''
      {"foo": 23 }
    ''')
    headers {
      header('''Accept''', '''application/json''')
      header('''Content-Type''', '''application/json''')
      header('''Host''', '''localhost:8080''')
      header('''Content-Length''', '''12''')
    }
  }
  response {
    status 200
    body('''
    bar
    ''')
    headers {
      header('''Content-Type''', '''application/json;charset=UTF-8''')
      header('''Content-Length''', '''3''')
    }
    testMatchers {
      jsonPath('$[?(@.foo >= 20)]', byType())
    }
  }
}

生成的文档(Asciidoc的示例)将包含格式化的合同(此文件的位置将为index/dsl-contract.adoc)。