我有一个像这样的(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
断言接收到的正文的多个部分?
您可以尝试使用
expectedMessagesMatches
并提供您自己的谓词。
例如。
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]"));