使用協議(JVM) - Java的在條約消費各個參數模式匹配測試
,所以我們有我們的API,它與幾個參數小數/浮點值響應。 「body」:{ 「status」:「api is up。」, 「totalTime」:0.005939006805419922 }「 }我嘗試了正則表達式匹配,但是pact body生成數據,這與返回的小數不匹配實際的API
package pact;
import au.com.dius.pact.consumer.dsl.DslPart;
import au.com.dius.pact.consumer.dsl.PactDslJsonBody;
import au.com.dius.pact.consumer.dsl.PactDslWithProvider;
import au.com.dius.pact.model.PactFragment;
import au.com.dius.pact.consumer.ConsumerPactTest;
import java.util.Map;
import java.util.HashMap;
import au.com.dius.pact.consumer.PactProviderRule;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.hasKey;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.nullValue;
import org.junit.Rule;
import au.com.dius.pact.consumer.dsl.PactDslJsonArray;
public class PactTest extends ConsumerPactTest {
@Rule
public PactProviderRule mockProvider = new PactProviderRule("test_provider", "localhost", 1234, this);
String v3Path = "/v3";
private DslPart body = new PactDslJsonBody()
.stringType("status", "api is up.")
.decimalType("totalTime", 0.005939006805419922);
protected PactFragment createFragment(PactDslWithProvider builder) {
Map<String, String> headers = new HashMap<String, String>();
headers.put("Content-Type", "application/json");
PactFragment fragment = builder
.uponReceiving("response")
.path(v3Path)
.method("GET")
.willRespondWith()
.status(200)
.headers(headers)
.body(body)
.toFragment();
return fragment;
}
@Override
protected String providerName() {
return "test_provider";
}
@Override
protected String consumerName() {
return "test_consumer";
}
@Override
protected void runTest(String url) {
Map response;
try {
response = new ConsumerClient(url).getAsMap(v3Path, "");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
協議生成:
{
"provider": {
"name": "test_provider"
},
"consumer": {
"name": "test_consumer"
},
"interactions": [
{
"description": "API v3 endpoint response",
"request": {
"method": "GET",
"path": "/v3"
},
"response": {
"status": 200,
"headers": {
"Content-Type": "application/json"
},
"body": {
"status": "api is up.",
"totalTime": 0.005939006805419922
},
"matchingRules": {
"body": {
"$.status": {
"matchers": [
{
"match": "type"
}
]
},
"$.totalTime": {
"matchers": [
{
"match": "decimal"
}
]
}
}
}
}
}
],
"metadata": {
"pact-specification": {
"version": "3.0.0"
},
"pact-jvm": {
"version": "3.5.0-beta.2"
}
}
}
DIFF協議的VS的實際響應:
0) Verifying a pact between test_consumer and test_provider - API v3 endpoint response returns a response which has a matching body
$.body.totalTime -> Expected 0.005939006805419922 but received 0.00545501708984375
DIFF:
@1
"status": "api is up.",
- "totalTime": 0.005939006805419922
+ "totalTime": 0.00545501708984375
}
所以是有可能做一個 「eachlike」,而不是decimalType來匹配這些值的模式?當我看着每一個像,它需要一個字符串和一個int - https://github.com/DiUS/pact-jvm/blob/master/pact-jvm-consumer/src/main/java/au/com/dius/pact/consumer/dsl/PactDslJsonBody.java#L580
請向我們展示您的協議測試代碼,而不是生成的協議文件。 –
@MatthewFellows - 我剛剛用生成pact文件的java代碼更新了我的問題。你能檢查一下嗎? – Shashi
謝謝,你可以發佈差異上方顯示的行,這將告訴實際的不匹配是什麼。 –