【问题标题】:Pact provider verification fails with : For input string: "\null"协议提供者验证失败:对于输入字符串:“\null”
【发布时间】:2021-01-11 05:12:30
【问题描述】:

我正在尝试在提供商方面进行验证,但出现错误 -

验证 DataConsumer 和 DataProvider 之间的协议 [使用文件协议/DataConsumer-DataProvider.json] 给定一些状态 对 json 数据的请求 请求失败 - 对于输入字符串:“\null”

不知道我在这里错过了什么。

我的宝乔-

@EqualsAndHashCode
@RequiredArgsConstructor
@Builder(toBuilder = true)
@JsonDeserialize(builder = DataModel.DataModelBuilder.class)
public class DataModel {

    @JsonProperty("name")
    private final String name;
    @JsonProperty("price")
    private final double price;
}

契约-

{
  "provider": {
    "name": "DataProvider"
  },
  "consumer": {
    "name": "DataConsumer"
  },
  "interactions": [
    {
      "description": "a request for json data",
      "request": {
        "method": "GET",
        "path": "/get/ice/2.0"
      },
      "response": {
        "status": 200,
        "headers": {
          "Content-Type": "application/json; charset\u003dUTF-8"
        },
        "body": {
          "price": 10,
          "name": "some name"
        },
        "matchingRules": {
          "header": {
            "Content-Type": {
              "matchers": [
                {
                  "match": "regex",
                  "regex": "application/json(;\\s?charset\u003d[\\w\\-]+)?"
                }
              ],
              "combine": "AND"
            }
          }
        },
        "generators": {
          "body": {
            "$.name": {
              "type": "ProviderState",
              "expression": "\\${name}",
              "dataType": "STRING"
            },
            "$.price": {
              "type": "ProviderState",
              "expression": "\\${price}",
              "dataType": "FLOAT"
            }
          }
        }
      },
      "providerStates": [
        {
          "name": "some state"
        }
      ]
    }
  ],
  "metadata": {
    "pactSpecification": {
      "version": "3.0.0"
    },
    "pact-jvm": {
      "version": "3.6.15"
    }
  }
}

测试-


@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@Provider("DataProvider")
@PactFolder(value = "pact")
public class ContractVerificationTest {

    @TestTemplate
    @ExtendWith(PactVerificationSpringProvider.class)
    void pactVerificationTestTemplate(PactVerificationContext context) {
        context.verifyInteraction();
    }

    @State("some state")
    void testPact() {
    }
}

代码-

https://github.com/nrworld4/pact-consumer-demo

https://github.com/nrworld4/pact-demo-provider

【问题讨论】:

    标签: pact pact-jvm pact-java


    【解决方案1】:

    您没有在提供者测试中从提供者状态注释中返回值(名称、价格)(它目前什么都不做),因此当 Pact 尝试在请求中动态替换值时,它们为空。

    你真的需要它们首先由提供者生成吗?

    https://pactflow.io/blog/injecting-values-from-provider-states/ 获取详细的使用和修复示例。

    更新 难道是你双重转义参数?

    在示例中:

    .queryParameterFromProviderState("accountNumber", "\${accountNumber}", "100")
    

    在你的code

    .valueFromProviderState("price", "\\${price}", 10.0)
    

    【讨论】:

    • 感谢您的回答,但在从 @State 注释方法返回值后,我仍然遇到相同的错误。我已经在provider项目中推送了代码更改,请看一下
    • 我刚刚更新了我的答案,也许是双重转义?
    • 不,在Java中我们必须使用双重转义
    猜你喜欢
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    相关资源
    最近更新 更多