能否基于现有DslPart构建新DslPart?Pact测试复用需求
问题描述
我正在编写Pact测试,测试的端点有两种行为:
- 传入id作为路径参数时(如
{baseUrl}/products/1),返回单个产品 - 无id时(如
{baseUrl}/products),返回所有产品的数组
我已经通过Lambda DSL构建了单个产品的JSON响应体:
DslPart product = newJsonBody((body) -> { body.numberType("id", 1); body.stringType("name", "product1"); body.stringType("type", "example"); body.array("attributes", (attributes) -> { attributes.object((attrib) -> { attrib.stringType("attrib1", "text1"); attrib.stringType("attrib2", "text2"); attrib.stringType("attrib3", "text3"); }); }); }).build();
现在想构建产品列表的响应体,希望复用已有的DslPart product,但尝试的写法不可行(products.object(product)要求传入LambdaDslObject,而非已构建的DslPart):
DslPart productList = newJsonBody((body) -> { body.array("products", (products) -> { products.object(product); // 这里报错,需要LambdaDslObject }); }).build();
目前只能重复编写产品的完整结构,请问能否基于现有DslPart构建新的DslPart?
解决方案
不能直接复用已构建好的DslPart实例传递给object()方法,因为该方法需要的是定义对象结构的Lambda表达式(LambdaDslObject消费者),而非已完成构建的DslPart对象。不过可以通过以下两种方式实现代码复用:
1. 抽离产品结构定义为独立方法
将单个产品的结构逻辑抽成一个单独的方法,构建单个产品和列表中的产品时都调用这个方法,既避免重复代码,又能灵活修改字段值:
// 抽离产品结构定义的方法 private static void buildProductStructure(LambdaDslObject body) { body.numberType("id", 1); body.stringType("name", "product1"); body.stringType("type", "example"); body.array("attributes", (attributes) -> { attributes.object((attrib) -> { attrib.stringType("attrib1", "text1"); attrib.stringType("attrib2", "text2"); attrib.stringType("attrib3", "text3"); }); }); }
构建单个产品
DslPart singleProduct = newJsonBody(YourTestClass::buildProductStructure).build();
构建产品列表
DslPart productList = newJsonBody((root) -> { root.array("products", (productsArray) -> { // 添加第一个产品,复用结构方法 productsArray.object(YourTestClass::buildProductStructure); // 添加第二个产品,基于复用结构修改部分字段 productsArray.object((productBody) -> { buildProductStructure(productBody); productBody.numberType("id", 2); productBody.stringType("name", "product2"); }); }); }).build();
2. 利用PactDslJsonArray构建数组(适用于无需修改产品内容的场景)
如果所有产品内容完全一致,可以先构建PactDslJsonArray,再将已有的产品DslPart强转为PactDslJsonObject添加进去:
// 构建产品数组 PactDslJsonArray productArray = new PactDslJsonArray(); productArray.object((PactDslJsonObject) product); // 可重复添加同一个产品实例 productArray.object((PactDslJsonObject) product); // 构建包含数组的响应体 DslPart productList = newJsonBody((root) -> { root.array("products", productArray); }).build();
内容的提问来源于stack exchange,提问作者Luis Nuño
相关产品推荐
相关产品推荐

