问题描述
我正在尝试在提供者端进行验证,但出现错误-
验证DataConsumer和DataProvider之间的协定 [使用文件pact / DataConsumer-DataProvider.json] 给定一些状态 对json数据的请求 请求失败-输入字符串:“ \ null”
不确定我在这里想念什么。
我的Pojo-
@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尝试在请求中动态替换值时,它们为空。
您实际上是否真的需要提供商首先生成它们?
请参阅 https://pactflow.io/blog/injecting-values-from-provider-states/中提供了有关如何使用和修复的详细示例。
更新 可能是您要对参数进行两次转义吗?
在示例中:
.queryParameterFromProviderState("accountNumber","\${accountNumber}","100")
在您的code中:
.valueFromProviderState("price","\\${price}",10.0)