|
对于最新的稳定版本,请使用 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父节点位置的注释
目录(换句话说,__文件是一个子目录)。你可以用春季资源
参照符号文件:。。。或Classpath:...地点。通用网址不是
支持。可以给出一个值列表——此时,WireMock 解析第一个文件
当它需要找到一个响应体时,它就存在。
当你配置文件根,它也影响
自动加载存根,因为它们来自根位置
在一个名为映射. |
的价值文件没有
对从显式加载的存根产生的影响存根属性。 |
替代方案:使用 JUnit 规则
如果想要更传统的WireMock体验,可以用JUnit@Rules开始和停止
服务器。为此,可以使用线缆仿Spring方便类以获得选项实例,如下例子所示:
这@ClassRule意味着服务器在完成该类所有方法后关闭
已经被运行了。
Rest模板的宽松SSL验证
WireMock允许你用httpsURL协议。如果你
应用程序想在集成测试中联系那个存根服务器,结果发现
SSL证书无效(这是自装证书常见的问题)。
最好的选择通常是重新配置客户端以使用http.如果那不是
你可以让Spring配置一个忽略SSL验证错误的HTTP客户端
(当然,这只是为了考试才这样做的。)
为了省事地实现这一点,你需要使用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 加载到
泉水MockRestServiceServer.以下项目展示了这一点。
这baseURL值会在所有模拟调用前加上,并且小作品(stubs)方法需要存根
路径资源模式作为一个参数。在前述示例中,存根定义在/小作品/resource.json加载到模拟服务器中。如果Rest模板被要求
访问example.org/,它会让响应被指定在该URL上声明。更多
可以指定一个存根模式,每个存根都可以是一个目录(递归
全部列表.json),固定文件名(如前例所示),或 Ant 样式
模式。JSON格式是正常的WireMock格式,你可以在WireMock官网上阅读相关内容。
目前,春云合约验证器支持Tomcat、Jetty和Undertow,作为 Spring Boot 嵌入式服务器,以及 Wiremock 本身对某一特定服务器有“原生”支持 Jetty的版本(目前为9.2)。要使用原生的 Jetty,你需要添加原生 用wiremock依赖,排除Spring Boot容器(如果有的话)。