Citrus:在验证之前转换JMS二进制消息

Citrus:在验证之前转换JMS二进制消息,jms,citrus-framework,Jms,Citrus Framework,我想先转换JMS二进制消息,然后在测试用例中验证它 我发现我可以接收这样的二进制消息 runner.receive(action -> action.endpoint("myJmsEndpoint") .messageType(MessageType.BINARY) .validator(new BinaryMessageValidator()) 但是,我必须提供自己的验证器实现(这里是BinaryMessageValidator),我正

我想先转换JMS二进制消息,然后在测试用例中验证它

我发现我可以接收这样的二进制消息

runner.receive(action -> 
action.endpoint("myJmsEndpoint")
            .messageType(MessageType.BINARY)
            .validator(new BinaryMessageValidator())
但是,我必须提供自己的验证器实现(这里是
BinaryMessageValidator
),我正在失去柑橘中可用的消息验证的全部功能

相反,我希望将消息转换为字符串,然后使用Citrus的正常验证功能

消息负载是一个普通的XML。消息作为JMS二进制消息发送只是SUT的一个实现细节


谢谢

您可以使用二进制base64消息验证程序(
MessageType.binary\u base64
)自动将二进制数据流转换为base64编码的字符串值。然后,预期的消息负载也被转换为base64编码的字符串。只需使用encodeBase64函数即可:

runner.receive(action -> action.endpoint("myJmsEndpoint")
        .messageType(MessageType.BINARY_BASE64)
        .payload("citrus:encodeBase64('<MyXmlMessage><content>Hello</content></MyXmlMessage>')")

.payload()
验证似乎忽略了我的自定义消息验证器。它抱怨
DomXmlMessageValidator只支持字符串类型的消息负载,但它是类[B
。因此它似乎使用原始消息,而不是转换后的消息。最后我有时间找到了这一点。如果消息类型是二进制的,则Citrus会将
controlMessage
转换为
byte[]
。这导致了我上一条评论的错误。当我还在自定义消息验证器中将
控制消息
转换为字符串时,两条消息都转换为
字符串
,并且使用
有效负载(预期)
进行验证的效果非常好。
public class CustomMessageValidator extends DomXmlMessageValidator {

    @Override
    public void validateMessage(Message receivedMessage, Message controlMessage,
        TestContext context, XmlMessageValidationContext validationContext)
        throws ValidationException {

        receivedMessage.setPayload(new String(receivedMessage.getPayload(byte[].class), FileUtils.getDefaultCharset()));

        super.validateMessage(receivedMessage,
            controlMessage, context, validationContext);
    }
}