当前位置: 首页 > 知识库问答 >
问题:

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

蒋奕
2023-03-14

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

所以目前我正在使用junit中的参数化测试来迭代我们的json数据,这基本上是有效的,只是因为生产者名称对于所有pacts都是相同的,它创建了相同的文件并覆盖了前面的文件。

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文件。

共有1个答案

归浩博
2023-03-14

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

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

有许多方法可以做到这一点,但如果您修改了示例测试,则可以使用DSL构建器通过在上一个.body之后再次调用.uponreceiving来链接调用。您可以在循环中执行此操作,对.uponreceiving的每一个附加调用都将开始向协议添加新的交互。你必须给每个交互一个独特的描述。

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

 类似资料:
  • 看看我制作的以下类: 以及它在以下方面的用法: 如果我使用,可能令人惊讶的是,我将永远得不到无限流。 相反,代码将在底层方法中创建时永远循环。 到目前为止,这是纯理论上的,但如果我想首先跳过无限流中的前x个数字,然后用最后的y个数字来限制它,我可以明确地理解它的必要性,如下所示: 代码不会返回一个结果,应该怎么做呢?

  • 是否可以从迭代器创建一个流,其中对象的序列与通过反复调用迭代器的next()方法生成的序列相同?我所考虑的具体情况涉及到Treeset.desceningIterator()返回的迭代器的使用,但是我可以想象在其他情况下,迭代器是可用的,而不是它所引用的集合。 例如,对于,我们可以编写并按照该集合的排序顺序获取该集合中的对象流,但是如果我们希望它们按照不同的顺序,比如通过使用获得的顺序呢?我想象的

  • 问题内容: 是否可以从迭代器创建一个Stream,其中对象的序列与通过重复调用迭代器的next()方法生成的对象的序列相同?我正在考虑的特定情况涉及TreeSet.descendingIterator()返回的迭代器的使用,但是我可以想象在其他情况下可以使用迭代器而不是它引用的集合。 例如,对于a,我们可以按照集合的排序顺序来编写并获取该集合中的对象流,但是如果我们希望它们以不同的顺序(例如,使用

  • 我天真地试图这样做: 要创建迭代器,我可以使用闭包轻松地发送到任务。 但是,它会产生可怕的寿命不匹配错误: 我不明白这个错误。 闭包应采用生命周期为“a”的参数,即结构的生命周期。 国家为结构所有,因此其生命周期为“a”。 使用下一步。召唤(( 所以这里的不匹配是下一个()中的自我终生和“呼叫中的a”之间的不匹配...但我不明白为什么它不是“a”。 修复上述代码的正确方法是什么? 有没有更好的方法

  • 有存储库文件夹,其中有100个图像文件夹。我想遍历每个文件夹,然后对这些文件夹中的图像执行相同的操作。 例如:存储库—— 有人知道优雅的做法吗? 我的操作系统是MacOS(里面有DS_Store元数据文件)