对于最新的稳定版本,请使用 spring-cloud-contract 5.0.0!spring-doc.cadn.net.cn

春云合约线缆模拟

Spring Cloud Contract WireMock 模块允许你在 Spring Boot 应用程序。想了解更多细节,可以查看 Spring Cloud Contract 的 repository samples 子文件夹spring-doc.cadn.net.cn

如果你有一个使用 Tomcat 作为嵌入式服务器的 Spring Boot 应用(也就是 默认Spring Boot启动网),你可以添加春云启动合同存根跑者添加到你的类路径,并添加@AutoConfigureWireMock在测试中使用 Wiremock。Wiremock 作为一个存根服务器运行,而你 可以通过使用 Java API 或静态 JSON 声明来注册存根行为 你的测试。spring-doc.cadn.net.cn

要在不同端口启动存根服务器,可以使用(例如),@AutoConfigureWireMock(port=9999).对于随机端口,使用一个值0.残根 服务器端口可以在测试应用上下文中绑定为wiremock.server.port财产。用@AutoConfigureWireMock增加一个类型的豆子WiremockConfiguration自 你的测试应用上下文,也就是它在方法和类之间缓存的位置 这些内容有相同的背景。Spring 集成测试也是如此。另外,你也可以 注射一颗 类型的豆子WireMockServer进入你的考试。 注册的WireMock服务器在每节测试课后重置。 不过,如果你每次测试方法后都需要重置,可以设置wiremock.reset-mappings-after-each-test属性到true.spring-doc.cadn.net.cn

自动注册存根

如果你使用,@AutoConfigureWireMock,它从文件中注册 WireMock JSON 存根 系统或类路径(默认情况下,来自文件:SRC/测试/资源/映射).您可以 通过使用存根注释中的属性,可以是 Ant式资源模式或目录。对于目录而言,*/.json是 附加。以下代码展示了一个示例:spring-doc.cadn.net.cn

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureWireMock(stubs="classpath:/stubs")
public class WiremockImportApplicationTests {

	@Autowired
	private Service service;

	@Test
	public void contextLoads() throws Exception {
		assertThat(this.service.go()).isEqualTo("Hello World!");
	}

}
实际上,WireMock总是从以下设备加载映射SRC/测试/资源/映射 如 以及存根属性。要改变这种行为,你可以 还要指定文件根,详见本文档下一节
另外,映射在存根位置不被视为Wiremock“默认映射”和调用的一部分 自com.github.tomakehurst.wiremock.client.WireMock.resetToDefaultMappings在测试过程中,不会导致映射 在存根地点也包括在内。然而,org.springframework.cloud.contract.wiremock.WireMockTestExecutionListener在每个测试类后重置映射(包括添加存根位置的映射),并且可选地, 在每个测试方法之后(由wiremock.reset-mappings-after-each-test财产)。

如果你使用Spring Cloud Contract的默认存根jar,你的 存根存储于/META-INF/组ID/artifact-id/versions/映射/文件夹。 如果你想注册该位置的所有存根,所有嵌入的 JAR,可以用 以下语法:spring-doc.cadn.net.cn

@AutoConfigureWireMock(port = 0, stubs = "classpath*:/META-INF...

使用文件来指定存根主体

WireMock 可以从类路径或文件系统文件中读取响应主体。在 以文件系统为例,你可以在 JSON DSL 中看到响应具有body文件名而不是 (字面意思)身体.文件解析相对于根目录(默认情况下,SRC/测试/资源/__files).要自定义这个位置,你可以设置文件属性@AutoConfigureWireMock父节点位置的注释 目录(换句话说,__文件是一个子目录)。你可以用春季资源 参照符号文件:。。。Classpath:...地点。通用网址不是 支持。可以给出一个值列表——此时,WireMock 解析第一个文件 当它需要找到一个响应体时,它就存在。spring-doc.cadn.net.cn

当你配置文件根,它也影响 自动加载存根,因为它们来自根位置 在一个名为映射.
的价值文件没有 对从显式加载的存根产生的影响存根属性。

替代方案:使用 JUnit 规则

如果想要更传统的WireMock体验,可以用JUnit@Rules开始和停止 服务器。为此,可以使用线缆仿Spring方便类以获得选项实例,如下例子所示:spring-doc.cadn.net.cn

@ClassRule意味着服务器在完成该类所有方法后关闭 已经被运行了。spring-doc.cadn.net.cn

Rest模板的宽松SSL验证

WireMock允许你用httpsURL协议。如果你 应用程序想在集成测试中联系那个存根服务器,结果发现 SSL证书无效(这是自装证书常见的问题)。 最好的选择通常是重新配置客户端以使用http.如果那不是 你可以让Spring配置一个忽略SSL验证错误的HTTP客户端 (当然,这只是为了考试才这样做的。)spring-doc.cadn.net.cn

为了省事地实现这一点,你需要使用Spring靴Rest模板构建器在你的应用中,如下示例所示:spring-doc.cadn.net.cn

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
	return builder.build();
}

你需要Rest模板构建器因为构建者会通过回调传递到 初始化它,这样客户端就能在那个位置设置 SSL 验证。这 如果你使用了@AutoConfigureWireMock注释或存根跑道。如果你用JUnit@Rule方法,你需要添加@AutoConfigureHttpClient注释也包括,如下示例所示:spring-doc.cadn.net.cn

@RunWith(SpringRunner.class)
@SpringBootTest("app.baseUrl=https://localhost:6443")
@AutoConfigureHttpClient
public class WiremockHttpsServerApplicationTests {

	@ClassRule
	public static WireMockClassRule wiremock = new WireMockClassRule(
			WireMockSpring.options().httpsPort(6443));
...
}

如果你使用,Spring靴启动测试,你有Apache HTTP客户端 classpath,并且由Rest模板构建器并配置为忽略 SSL 错误。如果你使用默认的java.net客户端,你不需要注释(但 无害)。目前没有支持其他客户端,但可能会增加 在未来的版本中。spring-doc.cadn.net.cn

以禁用自定义Rest模板构建器,设wiremock.rest-template-ssl-enabled属性到false.spring-doc.cadn.net.cn

WireMock 和 Spring MVC 模拟

Spring Cloud Contract 提供了一个方便类,可以将 JSON WireMock stubs 加载到 泉水MockRestServiceServer.以下项目展示了这一点。spring-doc.cadn.net.cn

baseURL值会在所有模拟调用前加上,并且小作品(stubs)方法需要存根 路径资源模式作为一个参数。在前述示例中,存根定义在/小作品/resource.json加载到模拟服务器中。如果Rest模板被要求 访问example.org/,它会让响应被指定在该URL上声明。更多 可以指定一个存根模式,每个存根都可以是一个目录(递归 全部列表.json),固定文件名(如前例所示),或 Ant 样式 模式。JSON格式是正常的WireMock格式,你可以在WireMock官网上阅读相关内容。spring-doc.cadn.net.cn

目前,春云合约验证器支持Tomcat、Jetty和Undertow,作为 Spring Boot 嵌入式服务器,以及 Wiremock 本身对某一特定服务器有“原生”支持 Jetty的版本(目前为9.2)。要使用原生的 Jetty,你需要添加原生 用wiremock依赖,排除Spring Boot容器(如果有的话)。spring-doc.cadn.net.cn