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")
的描述。