Spring RestDocs可用于为具备Spring MockMvc或RestEasy的HTTP API生成文档(例如,asciidoctor格式)。在生成API文档的同时,还可使用Spring Cloud Contract WireMock生成WireMock存根。只需编写正常的RestDocs测试用例,并使用@AutoConfigureRestDocs
在restdocs输出目录中自动存储存根。例如:web
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureRestDocs(outputDir = "target/snippets")
@AutoConfigureMockMvc
public class ApplicationTests {
@Autowired
private MockMvc mockMvc;
@Test
public void contextLoads() throws Exception {
mockMvc.perform(get("/resource"))
.andExpect(content().string("Hello World"))
.andDo(document("resource"));
}
}
今后测试将在“target / snippets / stubs / resource.json”上生成一个WireMock存根。它将全部GET请求与“/ resource”路径相匹配。正则表达式
没有任何其余配置,这将建立一个存根与HTTP方法的请求匹配器和除“主机”和“内容长度”以外的全部头。为了更准确地匹配请求,例如要匹配POST或PUT的正文,咱们须要明确建立一个请求匹配器。这将作两件事情:1)建立一个只匹配您指定的方式的存根,2)断言测试用例中的请求也匹配相同的条件。spring
主要的入口点是WireMockRestDocs.verify()
,能够替代document()
便利方法。例如:json
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureRestDocs(outputDir = "target/snippets")
@AutoConfigureMockMvc
public class ApplicationTests {
@Autowired
private MockMvc mockMvc;
@Test
public void contextLoads() throws Exception {
mockMvc.perform(post("/resource")
.content("{\"id\":\"123456\",\"message\":\"Hello World\"}"))
.andExpect(status().isOk())
.andDo(verify().jsonPath("$.id")
.stub("resource"));
}
}
因此这个合同是说:任何有效的POST与“id”字段将获得与本测试相同的响应。您能够未来电连接到.jsonPath()
以添加其余匹配器。若是 您不熟悉JayWay文档,能够帮助您加快JSON路径的速度。服务器
您也可使用WireMock API来验证请求是否与建立的存根匹配,而不是使用jsonPath
和contentType
方法。例:mvc
@Test
public void contextLoads() throws Exception {
mockMvc.perform(post("/resource")
.content("{\"id\":\"123456\",\"message\":\"Hello World\"}"))
.andExpect(status().isOk())
.andDo(verify()
.wiremock(WireMock.post(
urlPathEquals("/resource"))
.withRequestBody(matchingJsonPath("$.id"))
.stub("post-resource"));
}
WireMock API是丰富的 - 您能够经过正则表达式以及json路径来匹配头文件,查询参数和请求正文,所以这能够用于建立具备更普遍参数的存根。上面的例子会生成一个这样的stub:app
后resource.json
{
"request" : {
"url" : "/resource",
"method" : "POST",
"bodyPatterns" : [ {
"matchesJsonPath" : "$.id"
}]
},
"response" : {
"status" : 200,
"body" : "Hello World",
"headers" : {
"X-Application-Context" : "application:-1",
"Content-Type" : "text/plain"
}
}
}
注意
|
您可使用wiremock() 方法或jsonPath() 和contentType() 方法建立请求匹配器,但不能同时使用二者。 |
在消费方面,假设上面生成的resource.json
能够在类路径中使用,您可使用WireMock以多种不一样的方式建立一个存根,其中包括上述使用@AutoConfigureWireMock(stubs="classpath:resource.json")
的描述。