gpt4 book ai didi

json - 如何在协议(protocol)中验证字符串化的 json

转载 作者:行者123 更新时间:2023-12-03 20:50:29 24 4
gpt4 key购买 nike

我正在尝试使用异步通信在两个服务之间建立一个协议(protocol)。
这是我用来生成协议(protocol)的代码:

@ExtendWith(PactConsumerTestExt.class)
@PactTestFor(providerName = "provider", providerType = ProviderType.ASYNCH)
public class StringifiedPactTest {

@Pact(consumer = "consumer", provider = "provider")
public MessagePact generatePact(MessagePactBuilder builder) {
return builder.hasPactWith("provider")
.expectsToReceive("A valid aws sns event")
.withContent(new PactDslJsonBody().stringType(new String[]{"MessageId", "TopicArn"}).stringValue("Message", new PactDslJsonBody().stringType("Value", "Foo").toString()))
.toPact();
}

@Test
@PactTestFor(pactMethod = "generatePact")
public void buildPact(List<Message> messages) {

}
}
生成的契约是
{
"consumer": {
"name": "consumer"
},
"provider": {
"name": "provider"
},
"messages": [
{
"description": "A valid aws sns event",
"metaData": {
"contentType": "application/json"
},
"contents": {
"TopicArn": "string",
"Message": "{\"Value\":\"Foo\"}",
"MessageId": "string"
},
"matchingRules": {
"body": {
"$.MessageId": {
"matchers": [
{
"match": "type"
}
],
"combine": "AND"
},
"$.TopicArn": {
"matchers": [
{
"match": "type"
}
],
"combine": "AND"
}
}
}
}
],
"metadata": {
"pactSpecification": {
"version": "3.0.0"
},
"pact-jvm": {
"version": "4.0.10"
}
}
}
这意味着生产者应该有一个匹配 {"Value": "Foo"} 的“消息”,像 {"Value": "Bar"} 这样的任何其他组合都不会成功。
有没有办法在字符串化的 json 中添加匹配规则?
谢谢!

最佳答案

这是我们进行的测试中的一个匿名示例。希望它有用。这将创建一个仅在类型上匹配的协定。因此,在提供者方面,当我根据契约(Contract)进行测试时,例如,我对 categoryName 有什么值并不重要,只要它是一个 stringType:

@PactTestFor(providerName = "provider-service", providerType = ProviderType.ASYNCH)
public class providerServiceConsumerPactTest {

private static String messageFromJson;

@BeforeAll
static void beforeAll() throws Exception {
messageFromJson = StreamUtils.copyToString(new ClassPathResource("/json/pact/consumer-service_provider-service.json").getInputStream(), Charset.defaultCharset());

}

@Pact(provider = "provider-service", consumer = "consumer-service")
public MessagePact providerServiceMessage(MessagePactBuilder builder) {
DslPart body = new PactDslJsonBody()
.object("metaData")
.stringType("origin", "provider-service")
.datetimeExpression("dateCreated", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
.closeObject()
.minArrayLike("categories", 0, 1)
.stringType("id", "example data")
.stringType("categoryName", "example data")
.booleanType("clearance", false)
.closeObject()
.closeArray();

return builder
.expectsToReceive("a provider-service update")
.withContent(body)
.toPact();
}

@Test
@PactTestFor(pactMethod = "providerServiceMessage")
public void testProviderServiceMessage(MessagePact pact) {

// State

final String messageFromPact = pact.getMessages().get(0).contentsAsString();

// Assert

JSONAssert.assertEquals(messageFromPact, messageFromJson, false);
}

关于json - 如何在协议(protocol)中验证字符串化的 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63149128/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com