2017-04-06 57 views
0

使用协议(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

+0

请向我们展示您的协议测试代码,而不是生成的协议文件。 –

+0

@MatthewFellows - 我刚刚用生成pact文件的java代码更新了我的问题。你能检查一下吗? – Shashi

+0

谢谢,你可以发布差异上方显示的行,这将告诉实际的不匹配是什么。 –

回答

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; 
} 
+0

谢谢,那工作。 – Shashi