当前位置: 首页 > 知识库问答 >
问题:

AMQ消息的V3.0合同中的stringType匹配器执行文字匹配而不是类型匹配

胡高寒
2023-03-14

我有一个使用stringType匹配文件名的协定。契约还指定了type上的匹配器,但当我在提供者端运行测试时,它会执行字面匹配。我在调试时包含了合同、发送的JSON和一个屏幕截图。我注意到TypeMatcher是在MatchingRuleGroup中初始化的,但它没有字段。我不确定这是否正确

我尝试了3种方案:

>

  • StringValue(“bestandSID”,“20190219_foo_20190124.txt”)-->此操作有效

    pact-jvm-consumer-java82.12-版本3.6.2

    合同:

    {
        "consumer": {
            "name": "Consumer-event"
        },
        "provider": {
            "name": "Provider"
        },
        "messages": [
            {
                "description": "A message notifying a newly available foo file",
                "metaData": {
                    "bestandstype": "foo",
                    "Content-Type": "application/json"
                },
                "contents": {
                    "headers": {
                        "bestandstype": "foo",
                        "Content-Type": "application/json"
                    },
                    "payload": {
                        "bestandstype": "foo",
                        "bestandsid": "string"
                    }
                },
                "providerStates": [
                    {
                        "name": "A new FOO file is extracted"
                    }
                ],
                "matchingRules": {
                    "body": {
                        "$.payload$.bestandsid": {
                            "matchers": [
                                {
                                    "match": "type"
                                }
                            ],
                            "combine": "AND"
                        }
                    }
                }
            }
        ],
        "metadata": {
            "pactSpecification": {
                "version": "3.0.0"
            },
            "pact-jvm": {
                "version": "3.6.2"
            }
        }
    }
    

    实际事件

    {
        "headers": {
            "Content-Type": "application/json",
            "bestandstype": "foo",
            "id": "6838a619-efb7-6867-28bc-eb24609aa980",
            "timestamp": 1560410882485
        },
        "payload": {
            "afleidDatum": null,
            "bestandsid": "20190219_foo_20190124.txt",
            "bestandstype": "foo",
            "bron": null,
            "planDatum": null,
            "planType": "BAR"
        }
    }
    
        @Pact(provider = "DonnaFileshareReader", consumer = "DpcAdapter-event")
        public MessagePact eventNewDpcResource(MessagePactBuilder builder) {
    
            Map<String, String> metadata = new HashMap<>();
            metadata.put("Content-Type", "application/json");
            metadata.put("bestandstype", "dpc");
    
            PactDslJsonBody body = new PactDslJsonBody();
            body.object("headers")
                .stringValue("bestandstype", "dpc")
                .stringValue("Content-Type", "application/json")
                .closeObject();
            payload = new PactDslJsonBody();
            payload.stringValue("bestandstype", "dpc")
                   .stringValue("bestandsid", EXAMPLE_DPC_FILE_NAME)
                   .closeObject();
            body.object("payload", payload);
    
            return builder.given("A new DPC file is extracted")
                          .expectsToReceive("A message notifying a newly available dpc file")
                          .withMetadata(metadata)
                          .withContent(body)
                          .toPact();
        }
    
    
    Verifying a pact between DpcAdapter-event and DonnaFileshareReader
      Given A new FOO file is extracted
      A message notifying a newly available foo file
    2019-06-13 09:56:54.144  INFO [bar,,,] 7427 --- [           main] org.reflections.Reflections              : Reflections took 9011 ms to scan 388 urls, producing 275 keys and 35566 values 
        generates a message which
          has a matching body (FAILED)
          has matching metadata (OK)
    
    Failures:
    
    0) A message notifying a newly available foo file generates a message which has a matching body
          $.payload.bestandsid -> Expected 'string' but received '20190219_foo_20190124.txt'
    

    我希望stringType与String类型匹配。

  • 共有1个答案

    陶弘业
    2023-03-14

    解决了。

    通过将约定更改为1 PactDslJsonBody(),而不是使用body(object,payload)。

    新合同:

    body.object("headers")
                    .stringValue("bestandstype", "foo")
                    .stringValue("Content-Type", "application/json")
                    .closeObject();
            body.object("payload")
                    .stringValue("bestandstype", "foo")
                    .stringType("bestandsid", EXAMPLE_FOO_FILE_NAME)
                    .closeObject();
    
            JSONObject resourceDetail = (JSONObject)body.getBody();
            JSONObject payload = resourceDetail.getJSONObject("payload");
    
            Message<byte[]> pactMessage = MessageBuilder
                    .withPayload(payload.toString().getBytes())
                    .copyHeaders(messageProvider.getMetadata())
                    .build();
    
     类似资料:
    • 我遵循这个准则https://github.com/BUAA-BDA/FedShapley/tree/master/TensorflowFL并尝试运行相同的文件。派克 导入tensorflow时出现问题。同胞。v1显示无法导入“tensorflow.compat.v1”文件“sameOR.py” 这些是错误列表。。有人能帮忙吗?

    • 我在这里复制代码;https://developer.android.com/codelabs/kotlin-android-training-view-model#5 但我从DataBindingUtil中得到了一个类型不匹配。充气方法。正在返回ViewDataBinding!,当需要FragmentPlayBinding时。 我https://github.com/google-develop

    • 问题内容: 编写内部API时遇到以下错误。我正在尝试以以下方式读取值(SQL Server 2012): 现在,虽然看起来有些奇怪,但我以这种方式阅读的原因是因为它是我编写的包装程序的一部分,我们使用它来加快sql的读写速度。它接受一个匿名对象,并根据属性名称或属性名称将所有sql值读入其中。 这适用于除以外的所有内容。我进行了类型比较,它也同样失败,因此很hacky,我什至无法检查该列是否为类型

    • 执行匹配 一旦你有了已经编译了的正则表达式的对象,你要用它做什么呢?RegexObject 实例有一些方法和属性。这里只显示了最重要的几个,如果要看完整的列表请查阅 Python Library Reference 方法/属性 作用 match() 决定 RE 是否在字符串刚开始的位置匹配 search() 扫描字符串,找到这个 RE 匹配的位置 findall() 找到 RE 匹配的所有子串,并

    • 我正在使用Jacoco使用ANT查找单元测试的代码覆盖率,但报告没有生成,我得到了这个错误序列: 我已经阅读了这些答案,但似乎没有一个可以帮助我解决问题。 Jacoco代码覆盖报告生成器显示错误:“捆绑包‘代码覆盖报告’中的类与执行数据不匹配” jacoco:对于报告生成,必须使用与运行时相同的类文件 我在Eclipse上编译了所有类,并使用ANT构建工具对这些类执行代码覆盖。由于一些依赖关系,我

    • 我的密码应类似于: “密码应包含至少一个大写字母,一个小写字母,一个数字和一个特殊字符,长度至少为八个字符” 我使用的模式是: