java - 如何在 pact jvm 中迭代地创建 Pact 文件
问题描述
所以我有一个包含一些请求和响应数据的 json 文件,我想要完成的是遍历这些数据并创建一个使用每个请求和响应的 pact 文件。
所以目前我在junit中使用参数化测试来迭代我们的json数据,这基本上是可行的,除了因为所有协议的生产者名称都相同,它会创建相同的文件并覆盖以前的文件。
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;
}
不确定是否有更好的方法来实现这一点,我查看了 Pact Jvm 的 Github 并查看了堆栈溢出,但无法找到创建 pact 文件的人,而没有静态指定所有数据。
解决方案
Pact 文件本质上是一个 JSON 文档,其中包含有关消费者、提供者和交互列表的详细信息。在您的情况下,您似乎拥有相同的消费者和提供者,但是一个 JSON 文件包含构成交互的请求和响应。
因此,您需要创建一个单独的协议文件,但要为 JSON 文件中的每个项目添加一个交互。
有多种方法可以做到这一点,但如果您修改示例测试,则可以使用 DSL 构建器通过.uponReceiving
在最后一个 之后再次调用来链接调用.body
。您可以循环执行此操作,每次额外调用都.uponReceiving
将开始向协议添加新交互。您必须为每个交互提供独特的描述。
然后.toPact()
在最后调用以创建最终协议。
推荐阅读
- javascript - Google Maps API 信息窗口在 iOS 12 上不垂直滚动
- webpack - 如何在 index.html 模板中引用图片资源
- python-3.x - 使用 Glob 时模块对象不可调用
- javascript - Javascript - 按数组重新排序对象数组(值)
- jsonnet - Remove duplicates from an array of objects in jsonnet
- laravel - 资产辅助功能在 Laravel 5.7 中无法正常工作
- json - 如何使用 Airtable 作为后端?
- r - SunburstR:如何定义路径,即向 sunburst 添加更多层?
- python - Python Tkinter doesn't show the label when I press the button
- sql - Combine Rows in BigQuery Standard SQL Ignoring Nulls and filter to fullest row in efficient way