我遇到了“您尚未配置 MockMVC 实例”的问题。“mvn全新安装”时的异常。
跑步
org.springframework.cloud.contract.verifier.tests.ContractVerifierTest 测试运行:1,失败:0,错误:1,跳过:0,时间:0.185 秒 <<< 失败!- 在 org.springframework.cloud.contract.verifier.tests.ContractVerifierTest validate_shouldGetAmenities(org.springframework.cloud.contract.verifier.tests.ContractVerifierTest) 已用时间:0.184 秒 <<< 错误!java.lang.IllegalStateException:您尚未配置 MockMVC 实例。你可以静态地做到这一点
或使用 DSL:
给定()。模拟Mvc(..)。..
问题是,抛出此异常的测试是基于合约生成的测试。
这是合同。
package contracts
org.springframework.cloud.contract.spec.Contract.make {
request {
method 'GET'
url '/abc/def/serviceA?catalog=x'
body("")
}
response {
status 200
body(""
)
headers {
contentType(applicationJsonUtf8())
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是生成的测试。
package org.springframework.cloud.contract.verifier.tests;
public class ContractVerifierTest {
@Test
public void validate_shouldGetMyStuff() throws Exception {
// given:
MockMvcRequestSpecification request = given()
.body("\"\"");
// when:
ResponseOptions response = given().spec(request)
.get("/abc/def/serviceA?catalog=x");
// then:
assertThat(response.statusCode()).isEqualTo(200);
assertThat(response.header("Content-Type")).matches("application/json;charset=UTF-8.*");
// …Run Code Online (Sandbox Code Playgroud) 我在合同中定义了查询参数。我需要这个参数是可选的:
method 'GET'
url($(regex(urlRegex))) {
queryParameters {
parameter 'fitler': $(stub(regex(filterRegex)))
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这个合同适用于带有过滤器的 URL/my/sample/url?fitler=some-filter-expression和不带过滤器参数的URL /my/sample/url。
我怎样才能做到这一点?这甚至可能吗?
我正在处理 Spring cloud 合同文档,我看到了Spring cloud 文档依赖的评论,想知道这到底是什么 <!-- If you're adding this dependency explicitly you have to
add it *BEFORE* the Release Train BOM-->
我刚开始为我们的微服务设置使用消费者驱动的合同,因为它们主要是 Spring Boot 应用程序,所以自然选择 Spring Cloud Contract。但随之而来的是混乱。在 docs 中的所有示例中,合同都是在生产者端定义的,消费者从 maven 仓库中检索它们。如果生产者定义它们,它是如何由消费者驱动的?
我的理解是,概念上消费者将它们定义为生产者对其使用的部分 API 的期望。除了前面的问题,Spring Cloud Contract 是否可以在消费者端定义一个合约并在生产者端进行验证?
我正在尝试使用 Spring-Cloud-Contract 定义 CDC 合同,如下所示:
org.springframework.cloud.contract.spec.Contract.make {
request {
method 'GET'
url $(client(~/\/categories\?publication=[a-zA-Z-_]+?/), server('/categories?publication=DMO'))
}
response {
status 200
headers {
header('Content-Type', 'application/json;charset=UTF-8')
}
body """\
[{
"code": "${value(client('DagKrant'), server(~/[a-zA-Z0-9_-]*/))}",
"name": "${value(client('De Morgen Krant'), server(~/[a-zA-Z0-9_\- ]*/))}",
"sections" : []
},
{
"code": "${value(client('WeekendKrant'), server(~/[a-zA-Z0-9_-]*/))}",
"name": "${value(client('De Morgen Weekend'), server(~/[a-zA-Z0-9_\- ]*/))}",
"sections" : [
{
"id" : "${value(client('a984e824'), server(~/[0-9a-f]{8}/))}",
"name" : "${value(client('Binnenland'), server(~/[a-zA-Z0-9_\- ]*/))}"
}
]
}]
"""
}
}
Run Code Online (Sandbox Code Playgroud)
在生成的测试中,这会导致以下断言:
DocumentContext parsedJson = JsonPath.parse(response.getBody().asString());
assertThatJson(parsedJson).array().contains("code").matches("[a-zA-Z0-9_-]*");
assertThatJson(parsedJson).array().array("sections").contains("id").matches("([0-9a-f]{8})?");
assertThatJson(parsedJson).array().array("sections").contains("name").matches("[a-zA-Z0-9_\\- ]*");
assertThatJson(parsedJson).array().contains("name").matches("[a-zA-Z0-9_\\- ]*"); …Run Code Online (Sandbox Code Playgroud) 我一直在思考如何正确实现 Spring Cloud Contract Verifier,但是我试图通过合同强制执行的 JSON 很复杂,而且我不确定如何在 Groovy 表示中处理它。JSON 主体有时包含键的子对象,有时包含对象数组。
response {
status(200)
headers { contentType applicationJson() }
body(
"attrbte1": 777310402,
"attrbte2": 100,
"attrbte3": "CAPSULE",
"attrbte4": "01655",
"attrbte5": "281604",
"attrbte6": "28160420",
"genericCodeNo": 16353,
"stc": {
"stcAttrbt1": 10000001600,
"stcAttrbt2": "8875",
"stcAttrbt3: "2008-08-04T00:00:00.000+0000",
"stcAttrbt4": null
},
"gtc": {
"gtcAttbt1": 10000000028,
"gtcAttbt2": "0N",
"gtcAttbt3": "2008-08-04T00:00:00.000+0000"
},
"etcs": [
{
"etcAttbt1": 530,
"etcAttbt2": null,
"etcAttbt3": null
}
],
"icds": [
{
"icdCode": "F31.3",
"icdCode2": "F45.232"
},
{
"icdCode": "F40.01",
"icdCode2": "F44.2341"
}
]
) …Run Code Online (Sandbox Code Playgroud) @ClassRule
public static WireMockRule wireMockRule = new WireMockRule(9898);
@Test
public void createXmlFile() {
stubFor(get(urlPathEqualTo("/data/racing/"))
.willReturn(aResponse()
.withBody(loadJSONFile("unibet-demo-input.json"))));
}
Run Code Online (Sandbox Code Playgroud)
我不知道这里出了什么问题!
2019-01-16 15:54:05.810 [qtp1929284175-20] INFO ROOT:2341 - RequestHandlerClass from context returned com.github.tomakehurst.wiremock.http.StubRequestHandler. Normalized mapped under returned 'null'
2019-01-16 15:54:05.822 [qtp1929284175-15] INFO __admin:2341 - RequestHandlerClass from context returned com.github.tomakehurst.wiremock.http.AdminRequestHandler. Normalized mapped under returned 'null'
2019-01-16 15:54:05.925 [qtp1929284175-20] ERROR WireMock:40 - Request was not matched as there were no stubs registered:
{
"url" : "/data/racing/",
"absoluteUrl" : "http://localhost:9898/data/racing/",
"method" : "GET",
"clientIp" : "127.0.0.1",
"headers" …Run Code Online (Sandbox Code Playgroud) 我正在尝试将 Spring Cloud Contract 应用于使用 Spring Webflux 构建的 Reactive API。基本上能够以以下样式发送 Flux 并从 API 接收响应 Flux:
@RequestMapping("/endlessecho")
public Flux<String> endlessEcho(Flux<String> input) {
return input;
}
Run Code Online (Sandbox Code Playgroud)
但是,我无法在网上或文档中找到有关是否可以使用 Spring Cloud Contract 执行此操作的信息。
甚至可以为此编写合同吗?它能够提供 wiremock 并生成适当的 JUnit 测试吗?
我试图了解PACT和Spring Cloud Contract之间更好的工具,以实施消费者驱动程序合同测试。我没有找到任何明显的例子来寻找利弊。
我想实现CDCT,并且在我的项目中不使用Spring。根据我的理解,我认为PACT很好。
欢迎任何信息或建议。谢谢。
我正在使用 Spring Bootspring-cloud-contract-wiremock和com.github.tomakehurst.wiremock依赖项。我的线模定义存储在 json 文件中。像那样:
directoryA/mappings/detail-mapping-123.json:
{
"request" : {
"urlPath" : "/detail/123",
"method" : "GET"
},
"response" : {
"status" : 200,
"bodyFileName" : "detail.json",
"headers" : {
"Content-Type" : "application/json;charset=UTF-8"
}
}
}
Run Code Online (Sandbox Code Playgroud)
directoryA/__files/detail.json:
{
"id": "123",
"name": "name-123"
}
Run Code Online (Sandbox Code Playgroud)
directoryB/mappings/search-mapping-123.json:
{
"request" : {
"urlPath" : "/service/usa/search",
"queryParameters" : {
"query": {
"equalTo": "123"
}
},
"method" : "GET"
},
"response" : {
"status" : 200,
"bodyFileName" : "search-123.json",
"headers" …Run Code Online (Sandbox Code Playgroud) spring-cloud ×5
java ×3
wiremock ×3
dependencies ×1
groovy ×1
json ×1
junit ×1
pact ×1
pom.xml ×1