Apache Camel MockEndpoint:如何断言接收到的正文的(多个)部分

问题描述 投票:0回答:1

我有一个像这样的(Quarkus)集成测试:

@QuarkusTest
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class MyTest extends CamelQuarkusTestSupport {

    @EndpointInject("mock:my-mock")
    MockEndpoint myMockEndpoint;

    @Override
    protected void doAfterConstruct() throws Exception {
        adviceWith(context, "my-route", route -> route.weaveById("my-endpoint")
            .replace()
            .to("mock:my-mock"));
    }

    @Test
    void myTest() throws Exception {
        myMockEndpoint.expectedMessageCount(1);
        // How to assert (multiple) parts of received body?

        // Do testing...

        myMockEndpoint.assertIsSatisfied();
    }

}

我知道我可以用以下方式断言整个身体:

myMockEndpoint.expectedBodiesReceived("Entire body");

现在,如果(XML)有效负载实际上更大,我想知道如何断言它的多个部分?比如:

myMockEndpoint.expectedBodyReceived() // returns AssertionClause
        .body()                       // returns MockValueBuilder
        .contains("Some part")        // returns Predicate
        .contains("Another part");    // not possible

但是,如上所述的链接是不可能的。另外,如果我只有一个

contains
并随后结束表达式/语句,则不会考虑该断言。测试总是通过的,不管什么都通过了
contains

那么,如何使用 Apache Camel 的

MockEndpoint
断言接收到的正文的多个部分?

java apache-camel quarkus
1个回答
0
投票

您可以尝试使用

expectedMessagesMatches
并提供您自己的谓词。

https://javadoc.io/static/org.apache.camel/camel-mock/4.7.0/org/apache/camel/component/mock/MockEndpoint.html#expectedMessagesMatches(org.apache.camel.Predicate. ..)

例如。

mockEndpoint.expectedMessagesMatches(new Predicate() {
    @Override
    public boolean matches(Exchange exchange) {
        String body = exchange.getMessage().getBody(String.class);
        return body.contains("Some part") && 
               body.contains("Another part");    
    }
});

您还可以利用一些 Camel 内置谓词,例如

xpath
等。

mockEndpoint.expectedMessagesMatches(XPathBuilder.xpath("/item[@price > 10.00]"));
© www.soinside.com 2019 - 2024. All rights reserved.