【问题标题】:How to check if an api response matches a Java class?如何检查 api 响应是否与 Java 类匹配?
【发布时间】:2021-05-25 01:39:42
【问题描述】:

在我的项目中,我有一些用于 REST 通信的 DTO 类。使用空手道,我想创建一些外部 e2e/集成测试,以检查 API 响应是否符合 DTO 中定义的合同。为了保持整个设置干燥,我想避免手动编写描述 DTO 的空手道 JSON 模式。相反,我正在寻找一种将我的 Java 类转换为空手道 JSON 模式的方法。

我已经拥有的:

假设这是我的 Java DTO 之一。

@Getter
@Setter
@AllArgsConstructor
@SuperBuilder
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({"elements", "property_1", "property_2"})
public class MyComplexTypeListDTO extends MyBaseAPIResponseDTO {
    private List<MyComplexType> elements;
}

我有一个使用jsonschema-generator 的转换器,它为我提供了我班级的JSON-Schema 表示。

private static JsonNode getSchemaFor(Class clazz) {
        JacksonModule module = new JacksonModule();
        ObjectMapper objectMapper = new ObjectMapper();
        SchemaGeneratorConfigBuilder configBuilder = new SchemaGeneratorConfigBuilder(objectMapper, SchemaVersion.DRAFT_2019_09, OptionPreset.PLAIN_JSON)
                .with(module);
        SchemaGeneratorConfig config = configBuilder.build();
        SchemaGenerator generator = new SchemaGenerator(config);

        return generator.generateSchema(clazz);
    }

但是空手道的模式定义不同,结果不匹配。所以我要么需要一个从 Java 类直接到空手道模式的翻译器,要么需要一个翻译器/其他类型的 JSON 模式和空手道的 JSON 模式之间的粘合剂。

有没有办法检查 API 响应是否与我缺少的空手道 Java 类匹配?对于我遗漏的任何步骤,是否有一个方便的转换库或者我必须自己编写?

【问题讨论】:

    标签: karate


    【解决方案1】:

    我强烈建议您不要在测试中重复使用您的生产 DTO-s。想一想,您正在为失败做好准备 - 并且冒着没有意识到某人通过 IDE 等应用的“重构”何时会破坏您的 API 客户端的风险。

    您应该从客户端的角度进行测试,对于许多团队来说,客户端是一个网络浏览器。这就是空手道避开 Java 并坚持使用 JSON + HTTP 的原因。

    第二,在我看来,模式匹配测试几乎没有什么价值。根据您所说的,您的 JSON 很可能已经从 DTO-s 生成,这使得它在您的特定情况下的价值更低。

    对不起,如果这听起来很苛刻,但我看到这个错误到处都是。 DRY 是over-rated,尤其是在测试自动化环境中。

    也就是说,如果你幸运的话,karate.toJson() 方法可以将你的 DTO-s 转换为 JSON,但是如果你使用一些花哨的注解它可能不起作用,它都是基于 JavaBean 约定的。

    最后我想说的是,只使用 Java 互操作,调用一些 Java 库来进行架构验证,并在 schema.feature 中看到 here 中的一天。

    总而言之,我认为您应该忘记模式验证并专注于测试 API-s 的“业务流程”,您通常在其中链接 API-s。创建产品。创建订单。检查库存是否减少。等等。一旦你有了这些,然后考虑是否值得测试模式匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-25
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多