1

使用 pact-jvm - Java

所以我们有我们的 api,它以十进制/浮点值响应几个参数。"body": { "status": "api is up.", "totalTime": 0.005939006805419922 }" 我尝试使用正则表达式匹配,但协议正文生成数据,这与实际 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"
    }
}

}

协议与实际响应的差异:

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

差异:

  @1
      "status": "api is up.",
  -    "totalTime": 0.005939006805419922
  +    "totalTime": 0.00545501708984375
  }

那么是否可以使用“eachlike”而不是 decimalType 来匹配这些值的模式?当我查看 eachLike 时,它​​接受一个字符串和一个 int - https://github.com/DiUS/pact-jvm/blob/master/pact-jvm-consumer/src/main/java/au/com/dius /pact/consumer/dsl/PactDslJsonBody.java#L580

4

1 回答 1

1

看起来您在消费者测试中使用的 Pact 库版本与用于验证提供者的版本之间存在版本不匹配。

您的消费者测试使用的是协议库 (3.5.0-beta.2) 的 V3,并且正在生成 V3 匹配器表达式 ( $.totalTime)。

当针对提供者验证协议时,它需要 V2 表达式 ( $.body.totalTime),然后使用相等进行匹配,因为它认为该属性没有匹配器。

如果在消费者测试中降级到 3.3.7 版本,将默认为 V2。或者您可以通过将以下内容添加到您的测试类来强制使用 V2 并仍然使用 3.5.0-beta.2:

@Override
protected PactSpecVersion getSpecificationVersion() {
    return PactSpecVersion.V2;
}
于 2017-04-10T22:58:02.787 回答