|
该版本仍在开发中,尚未被视为稳定。对于最新的稳定版本,请使用 spring-cloud-contract 5.0.0! |
春云合约线缆模拟
Spring Cloud Contract WireMock 模块允许你在 Spring Boot 应用程序。想了解更多细节,可以查看 Spring Cloud Contract 的 repository samples 子文件夹。
如果你有一个使用 Tomcat 作为嵌入式服务器的 Spring Boot 应用(也就是
默认Spring Boot启动网),你可以添加春云启动合同存根跑者添加到你的类路径,并添加@AutoConfigureWireMock在测试中使用 Wiremock。Wiremock 作为一个存根服务器运行,而你
可以通过使用 Java API 或静态 JSON 声明来注册存根行为
你的测试。
要在不同端口启动存根服务器,可以使用(例如),@AutoConfigureWireMock(port=9999).对于随机端口,使用一个值0.残根
服务器端口可以在测试应用上下文中绑定为wiremock.server.port财产。用@AutoConfigureWireMock增加一个类型的豆子WiremockConfiguration自
你的测试应用上下文,也就是它在方法和类之间缓存的位置
这些内容有相同的背景。Spring 集成测试也是如此。另外,你也可以
注射一颗 类型的豆子WireMockServer进入你的考试。
注册的WireMock服务器在每节测试课后重置。
不过,如果你每次测试方法后都需要重置,可以设置wiremock.reset-mappings-after-each-test属性到true.
自动注册存根
如果你使用,@AutoConfigureWireMock,它从文件中注册 WireMock JSON 存根
系统或类路径(默认情况下,来自文件:SRC/测试/资源/映射).您可以
通过使用存根注释中的属性,可以是
Ant式资源模式或目录。对于目录而言,*/.json是
附加。以下代码展示了一个示例:
@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,可以用
以下语法:
@AutoConfigureWireMock(port = 0, stubs = "classpath*:/META-INF...
使用文件来指定存根主体
WireMock 可以读取类路径或文件系统文件中的响应主体。 在 以文件系统为例,你可以在 JSON DSL 中看到响应具有body文件名而不是(字面意思)身体. 文件解析相对于根目录(默认情况下,SRC/测试/资源/__files). 要自定义这个位置,你可以设置文件属性@AutoConfigureWireMock注释至父目录的位置目录(换句话说,__文件是一个子目录)。你可以使用 Spring 资源符号来引用文件:。。。或Classpath:...地点。 通用URL不是 支持。 可以给出一个值列表——此时,WireMock 解析第一个文件当它需要找到响应体时,它就存在这个文件。
当你配置文件根节点,它也影响存根的自动加载,因为它们来自根位置在一个名为映射. |
的价值文件对从显式加载的存根没有影响存根属性。 |
替代方案:使用 JUnit 规则
如果想要更传统的WireMock体验,可以用JUnit@Rules启动和停止服务器。要做到这一点,请使用线缆仿Spring方便类以获得选项实例,如下例子所示:
这@ClassRule意味着服务器在该类中的所有方法运行完后才关闭。
Rest模板的宽松SSL验证
WireMock允许你用httpsURL 协议。如果你的应用想在集成测试中联系那个存根服务器,它会发现SSL 证书无效(这是自安装证书常见的问题)。最好的选择通常是重新配置客户端以使用http. 如果这不是选项,你可以让 Spring 配置一个 HTTP 客户端,忽略 SSL 验证错误(当然,这只适用于测试。)
为了省事地实现这一点,你需要使用Spring靴Rest模板构建器在你的应用中,如下示例所示:
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder.build();
}
你需要Rest模板构建器因为构建器会通过回调传递初始化它,因此可以在客户端中设置 SSL 验证。 这 如果你使用了@AutoConfigureWireMock注释或存根运行器。如果你用JUnit@Rule方法,你需要添加@AutoConfigureHttpClient注释也包括,如下示例所示:
@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客户端,你不需要注释(但它不会有害)。目前没有对其他客户端的支持,但可能会在未来的版本中添加。在未来的版本中。
以禁用自定义Rest模板构建器,设wiremock.rest-template-ssl-enabled属性到false.
WireMock 和 Spring MVC 模拟
Spring Cloud Contract 提供了一个方便类,可以将 JSON WireMock stubs 加载到a SpringMockRestServiceServer. 以下项目展示了这一点。
这baseURL值会在所有模拟调用前加上,并且小作品(stubs)方法以路径资源模式为参数。在前述示例中,定义在 的存根/小作品/resource.json加载到模拟服务器中。如果Rest模板被要求 访问example.org/它会在该URL上获得响应声明。 更多 然后可以指定一个存根模式,每个存根都可以是一个目录(递归的列表所有列表.json固定文件名(如前例所示),或 Ant 样式 模式。 JSON 格式是普通的 WireMock 格式,你可以在 WireMock 网站上阅读相关内容。
目前,Spring Cloud 合同验证器支持 Tomcat、Jetty 和 Undertow 作为Spring Boot 嵌入式服务器,Wiremock 本身对某个特定版本的 Jetty(目前为 9.2)提供“原生”支持Jetty。要使用原生 Jetty,你需要添加原生Wiremock 依赖,并排除 Spring Boot 容器(如果存在的话)。