2017-04-06 20 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