Wiremock记录以下请求不匹配:
WireMock : Request was not matched:
{
"url" : "/api/accounts?username=defaultuser",
"absoluteUrl" : "http://localhost:11651/api/accounts?username=defaultuser",
"method" : "GET",
"clientIp" : "127.0.0.1",
"headers" : {
"authorization" : "bearer test123",
"accept" : "application/json, application/*+json",
"user-agent" : "Java/1.8.0_121",
"host" : "localhost:11651",
"connection" : "keep-alive"
},
"cookies" : { },
"browserProxyRequest" : false,
"loggedDate" : 1500711718016,
"bodyAsBase64" : "",
"body" : "",
"loggedDateString" : "2017-07-22T08:21:58Z"
}
Closest match:
{
"urlPath" : "/api/accounts",
"method" : "GET",
"headers" : {
"authorization" : {
"matches" : "^bearer"
}, …Run Code Online (Sandbox Code Playgroud) spring-boot spring-cloud spring-cloud-netflix spring-cloud-contract
我正在使用 Spring Cloud Contract Verifier
org.springframework.cloud:spring-cloud-starter-contract-verifier:jar:2.0.0.M8 org.springframework.cloud:spring-cloud-contract-maven-plugin:1.2.4.RELEASE
我有以下合同:
request:
method: GET
url: /cars/list
response:
status: 200
headers:
Content-Type: application/json;charset=UTF-8
body:
cars:
[
{
"make": "Ford",
"model": "Fiesta",
"year": 2016,
"price": 16500.50
},
{
"make": "BMW",
"model": "X1",
"year": 2014,
"price": 22000.00
},
{
"make": "NISSAN",
"model": "Juke",
"year": 2017,
"price": 19300.00
}
]
Run Code Online (Sandbox Code Playgroud)
然后在以下java代码中转换:
DocumentContext parsedJson = JsonPath.parse(response.getBody().asString());
assertThatJson(parsedJson).array("['cars']").contains("['model']").isEqualTo("Juke");
assertThatJson(parsedJson).array("['cars']").contains("['make']").isEqualTo("Ford");
assertThatJson(parsedJson).array("['cars']").contains("['year']").isEqualTo(2014);
assertThatJson(parsedJson).array("['cars']").contains("['year']").isEqualTo(2016);
assertThatJson(parsedJson).array("['cars']").contains("['model']").isEqualTo("Fiesta");
assertThatJson(parsedJson).array("['cars']").contains("['make']").isEqualTo("BMW");
assertThatJson(parsedJson).array("['cars']").contains("['year']").isEqualTo(2017);
assertThatJson(parsedJson).array("['cars']").contains("['make']").isEqualTo("NISSAN");
assertThatJson(parsedJson).array("['cars']").contains("['price']").isEqualTo(16500.5);
assertThatJson(parsedJson).array("['cars']").contains("['model']").isEqualTo("X1");
assertThatJson(parsedJson).array("['cars']").contains("['price']").isEqualTo(22000.0);
assertThatJson(parsedJson).array("['cars']").contains("['price']").isEqualTo(19300.0);
Run Code Online (Sandbox Code Playgroud)
我对这个测试有几个问题:
1)它不考虑顺序,这意味着以下机构仍将被视为有效:
{
"cars": [
{
"make": "NISSAN",
"model": "Juke", …Run Code Online (Sandbox Code Playgroud) 根据官方文档How to Debug,我需要将以下内容添加到属性文件中以启用日志记录
logging.level.org.apache.http.wire=DEBUG
logging.level.com.github.tomakehurst.wiremock=DEBUG
Run Code Online (Sandbox Code Playgroud)
但是,当请求发送到wiremock服务器时,我在控制台上看不到任何可见的日志。我500 Internal Server Error只得到特定的平台。因此,为了排除故障,我尝试在请求到达wiremock服务器时拦截活动。
在我的 pom 文件中
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-contract-stub-runner</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
<scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我还尝试添加logback-test.xml包含以下内容的文件。但是,这也没有记录任何内容。
<logger name="com.github.tomakehurst.wiremock" level="DEBUG"/>
<logger name="wiremock.org" level="DEBUG"/>
<logger name="WireMock" level="DEBUG"/>
<logger name="/" level="DEBUG"/>
Run Code Online (Sandbox Code Playgroud)
我的测试班
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT,
classes = MyApplication.class)
@AutoConfigureMockMvc
@TestPropertySource(
locations = "/application-integration-test.properties"
)
@AutoConfigureWireMock(port = 0)
@AutoConfigureWebTestClient(timeout = "100000")
public class MyApplicationTest {
private WebTestClient client;
@LocalServerPort
private int port;
@Before
public void …Run Code Online (Sandbox Code Playgroud) 我正在尝试为GET请求创建合同,并且我想使用path参数,该参数也可以在响应中重用。这是可能吗?我只能找到POST,查询参数和正文的示例。因此,如果我想定义一个请求实体的合同,即/ books / 12345-6688,则想在响应中重用指定的ID。
如何为这样的合同创建合同?
Spring Cloud Contract Gradle 插件 (2.0.2.RELEASE)
我的Kotlin项目是一个带有合同文件的Spring Boot 2.0.5.RELEASE应用程序,并且基本测试类成功生成了一个文件,打开该文件表明 IntelliJ 对该文件感到满意,但运行失败Groovysrc/test/resources/contractscom.mycompany.practice.base.producer.PracticeMessagingBaseContractVerifierTest./gradlew clean buildcompileTestGroovy
> Task :compileTestGroovy FAILED
file or directory '/Users/abc/Documents/code/dev/practice-service/src/test/groovy', not found
file or directory '/Users/abc/Documents/code/dev/practice-service/src/test/groovy', not found
Task ':compileTestGroovy' is not up-to-date because:
Task has failed previously.
Excluding []
file or directory '/Users/abc/Documents/code/dev/practice-service/src/test/groovy', not found
Starting process 'Gradle Worker Daemon 1'. Working directory: /Users/abc/.gradle/workers Command: /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/bin/java -Djava.security.manager=worker.org.gradle.process.internal.worker.child.BootstrapSecurityManager -Dfile.encoding=UTF-8 -Duser.country=GB -Duser.language=en -Duser.variant -cp /Users/abc/.gradle/caches/4.7/workerMain/gradle-worker.jar worker.org.gradle.process.internal.worker.GradleWorkerMain 'Gradle Worker Daemon 1' …Run Code Online (Sandbox Code Playgroud) 我有一个 spring 云合同基础测试类:
public abstract class TestsBase {
@Autowired
protected MyFirstController myFirstController;
...
RestAssuredMockMvc.standaloneSetup(myFirstController);
}
Run Code Online (Sandbox Code Playgroud)
这个类在我的 maven 插件配置中被引用如下:
<plugin>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-contract-maven-plugin</artifactId>
<version>${spring-cloud-contract.version}</version>
<extensions>true</extensions>
<configuration>
<basePackageForTests>com.contracts.basepackage</basePackageForTests>
<baseClassForTests>com.contracts.basepackage.TestsBase</baseClassForTests>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
我需要在MySecondController此设置中添加第二个控制器。只是添加
RestAssuredMockMvc.standaloneSetup(mySecondController);
Run Code Online (Sandbox Code Playgroud)
不起作用。知道我如何实现这一目标吗?我还没有在任何地方找到解决方案。