【问题标题】:Validating multiple messages on the same JMS endpoint in Citrus Framework在 Citrus 框架中验证同一 JMS 端点上的多条消息
【发布时间】:2017-06-02 09:03:31
【问题描述】:

我正在发送一条生成多条消息的消息,其中两条到达同一个 JMS 端点。

runner.send(sendMessageBuilder -> sendMessageBuilder.endpoint(inputMessage.getEndpoint())
    .messageType(MessageType.XML)
    .payload(inputMessage.getPayload())
    .header(JMSOUTPUTCORRELATIONID, correlationId));

for(OutputMessage outputMessage : inputMessage.getOutputMessages()) {
     runner.receive(receiveMessageBuilder -> receiveMessageBuilder.endpoint(outputMessage.getEndpoint())
        .schemaValidation(false)
        .payload(outputMessage.getPayload())
        .header(JMSOUTPUTCORRELATIONID, correlationId));
}

在同一端点上验证两条消息时,我无法找到将它们与各自的预期输出相匹配的方法。 我想知道 Citrus 是否有内置方法来执行此操作,或者我是否可以构建一个条件,如果第一个失败,则检查其他预期输出。

【问题讨论】:

    标签: java automated-tests integration-testing citrus-framework


    【解决方案1】:

    我添加了一个自定义验证器。

    List<OutputMessage> outputMessages = inputMessage.getOutputMessages();
    while(outputMessages.size() > 0) {
        OutputMessage outputMessage = outputMessages.get(0);
        runner.receive(receiveMessageBuilder -> receiveMessageBuilder.endpoint(outputMessage.getEndpoint())
            .schemaValidation(true)
            .validator(new MultipleOutputMessageValidator(outputMessages))
            .header(JMSOUTPUTCORRELATIONID, correlationId));
    }
    

    向验证器提供尚未验证的预期输出列表。然后它将尝试根据接收到的消息验证列表中的每个预期输出,如果验证成功,则从列表中删除该预期输出。

    public class MultipleOutputMessageValidator extends DomXmlMessageValidator {
        private static Logger log = LoggerFactory.getLogger(MultipleOutputMessageValidator.class);
        private List<OutputMessage> controlMessages;
    
        public MultipleOutputMessageValidator(List<OutputMessage> controlMessages) {
            this.controlMessages = controlMessages;
        }
    
        @Override
        public void validateMessagePayload(Message receivedMessage, Message controlMessage, XmlMessageValidationContext validationContext, TestContext context) throws ValidationException {
            Boolean isValidated = false;
            for (OutputMessage message : this.controlMessages) {
                try {
                    super.validateMessagePayload(receivedMessage, message, validationContext, context);
                    isValidated = true;
                    controlMessages.remove(message);
                    break;
                } catch (ValidationException e) {
                    // Do nothing for now
                }
            }
            if (!isValidated) {
                throw new ValidationException("None of the messages validated");
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      您应该使用 JMS 消息选择器,这样您就可以根据技术标识符从该队列中“挑选”一条消息。例如,此选择器可以是 JMS 消息标头(在您的情况下为标头 JMSOUTPUTCORRELATIONID)。这样您就可以确保首先收到您要验证的消息。

      示例用法:

      receive(action -> action.endpoint(someEndpoint)
                  .selector("correlationId='Cx1x123456789' AND operation='getOrders'"));
      

      Citrus 消息选择器支持描述为here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-25
        • 2014-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多