首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Pact jvm中迭代创建pact文件

如何在Pact jvm中迭代创建pact文件
EN

Stack Overflow用户
提问于 2018-06-27 21:52:23
回答 1查看 570关注 0票数 0

因此,我有一个包含一些请求和响应数据的json文件,我想要完成的是遍历这些数据并创建一个使用每个请求和响应的pact文件。

所以目前我在junit中使用了一个参数化的测试来迭代我们的json数据,这基本上是可行的,除了因为生产者名称对于所有的协定都是相同的,它创建了相同的文件并覆盖了之前的文件。

代码语言:javascript
复制
private JsonObject requestObject;
private static Gson gson = new Gson();
private static File jsonFile = readJsonFile();
private static  int randValue = new Random().nextInt(500);
private static String consmerName = "phx-ev-consumer" + randValue;
@Rule
public PactProviderRuleMk2 provider = new PactProviderRuleMk2("phx-ev-svc-provider", "localhost", 8080, this);
final RestTemplate restTemplate = new RestTemplate();

public EligibilityApiConsumerPactTest(JsonObject requestObject) {
    this.requestObject = requestObject;
}




@Parameterized.Parameters
public static Collection primeNumbers() throws JsonSyntaxException, JsonIOException, FileNotFoundException {
    return getJson();
}

@Pact(state = "provider accets submit contact form", provider = "phx-ev-svc-provider" , consumer = "phx-ev-consumer")
public RequestResponsePact createFragment(PactDslWithProvider builder) {
    Map<String, String> requestHeaders = new HashMap<>();
    requestHeaders.put("Content-Type", "application/json");
    requestHeaders.put("SM_USER", "wtadmin");
    requestHeaders.put("Cookie", "SMCHALLENGE=YES");
    // Auth headers
    String authString = "wtadmin:labcorp1";
    String authEncoded = Base64.getEncoder().encodeToString(authString.getBytes());
    requestHeaders.put("Authorization", "Basic " + authEncoded);
    Map<String, String> responseHeaders = new HashMap<>();
    responseHeaders.put("Content-Type", "application/json");
    String jsonRequest = requestObject.get("request").toString();
    String jsonResponse = requestObject.get("response").toString();

    RequestResponsePact pact = builder.given("phx-eligibility").uponReceiving("Phoenix Eligibility Request")
            .method("POST").headers(requestHeaders).body(jsonRequest).path("/phx-rest/eligibility")
            .willRespondWith().status(200).headers(responseHeaders).body(jsonResponse).toPact();
    return pact;
}

@Test
@PactVerification("phx-ev-svc-provider")
public void runTest() throws IOException {
    MultiValueMap<String, String> requestHeaders = new LinkedMultiValueMap<>();
    requestHeaders.add("Content-Type", "application/json");
    requestHeaders.add("SM_USER", "wtadmin");
    requestHeaders.add("Cookie", "SMCHALLENGE=YES");
    // Auth headers
    String authString = "wtadmin:labcorp1";
    String authEncoded = Base64.getEncoder().encodeToString(authString.getBytes());
    requestHeaders.add("Authorization", "Basic " + authEncoded);
    String jsonRequest = requestObject.get("request").toString();
    restTemplate.exchange(provider.getConfig().url() + "/phx-rest/eligibility", HttpMethod.POST,
            new HttpEntity<>(jsonRequest, requestHeaders), String.class);

}

public static List<JsonObject> getJson() throws JsonSyntaxException, JsonIOException, FileNotFoundException {
    List<JsonObject> results = new ArrayList<JsonObject>();
    JsonObject jsonObject = gson.fromJson(new FileReader(jsonFile), JsonObject.class);
    JsonArray input = jsonObject.getAsJsonArray("input");
    Iterator<JsonElement> iter = input.iterator();
    while (iter.hasNext()) {
        JsonObject obj = (JsonObject) iter.next();
        results.add(obj);
    }
    return results;
}

public static File readJsonFile() {
    File base = new File("");
    File inputFile = new File(base.getAbsolutePath() + "/pact/input/eligibility.json");
    return inputFile;
}

不确定是否有更好的方法来实现这一点,我已经查看了Github for Pact Jvm,并查看了堆栈溢出,但没有找到创建pact文件的人,而没有静态地指定所有数据。

EN

回答 1

Stack Overflow用户

发布于 2018-06-28 17:56:58

Pact文件本质上是一个JSON文档,其中包含有关消费者、提供者和交互列表的详细信息。在您的示例中,您似乎有相同的使用者和提供者,但有一个JSON文件,其中包含组成交互的请求和响应。

因此,您需要创建一个单独的pact文件,但是要为JSON文件中的每个项目添加一个交互。

有很多方法可以做到这一点,但是如果您修改了示例测试,您可以使用DSL builder链接调用,方法是在最后一次.body之后再次调用.uponReceiving。您可以在循环中执行此操作,每次对.uponReceiving的额外调用都将开始向pact中添加一个新的交互。您必须为每个交互提供唯一的描述。

然后在最后调用.toPact()来创建最终的协议。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51064601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档