WireMock和Spring MVC模拟器

WireMock和Spring MVC模拟器

Spring Cloud Contract提供了一个方便的类,能够将JSON WireMock存根加载到Spring MockRestServiceServer中。如下是一个例子:java

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.NONE)
public class WiremockForDocsMockServerApplicationTests {

	@Autowired
	private RestTemplate restTemplate;

	@Autowired
	private Service service;

	@Test
	public void contextLoads() throws Exception {
		// will read stubs classpath
		MockRestServiceServer server = WireMockRestServiceServer.with(this.restTemplate)
				.baseUrl("http://example.org").stubs("classpath:/stubs/resource.json")
				.build();
		// We're asserting if WireMock responded properly
		assertThat(this.service.go()).isEqualTo("Hello World");
		server.verify();
	}
}

baseUrl前面是全部模拟调用,stubs()方法将一个存根路径资源模式做为参数。因此在这个例子中,/stubs/resource.json定义的存根被加载到模拟服务器中,因此若是RestTemplate被要求访问http://example.org/,那么它将获得所声明的响应。能够指定多个存根模式,每一个能够是一个目录(对于全部“.json”的递归列表)或一个固定的文件名(如上例所示)或一个蚂蚁样式模式。JSON格式是一般的WireMock格式,您能够在WireMock网站上阅读。git

目前,咱们支持Tomcat,Jetty和Undertow做为Spring Boot嵌入式服务器,而Wiremock自己对特定版本的Jetty(目前为9.2)具备“本机”支持。要使用本地Jetty,您须要添加本机线程依赖关系,并排除Spring Boot容器(若是有的话)。github

使用RestDocs生成存根

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来验证请求是否与建立的存根匹配,而不是使用jsonPathcontentType方法。例: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")的描述。

相关文章
相关标签/搜索