0

我想在 Citrus 测试用例中验证之前转换 JMS 二进制消息。

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

runner.receive(action -> 
action.endpoint("myJmsEndpoint")
            .messageType(MessageType.BINARY)
            .validator(new BinaryMessageValidator())

但是,我必须提供自己的验证器实现(这里BinaryMessageValidator),并且我失去了 Citrus 中可用的消息验证的全部功能。

相反,我想将消息转换为 String ,然后使用Citrus 的正常验证功能

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

谢谢

4

1 回答 1

1

您可以使用二进制 base64 消息验证器 ( MessageType.BINARY_BASE64),它会自动将二进制数据流转换为 base64 编码的字符串值。然后,预期的消息负载也会转换为 base64 编码的字符串。只需为此使用 encodeBase64 Citrus 函数:

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

这将对编码的 base64 字符串值执行纯文本消息验证。

如果您想使用完整的 Citrus XML 消息验证器功能,您需要编写一个自定义消息验证器,该消息验证器从com.consol.citrus.validation.xml.DomXmlMessageValidator. 在这个自定义验证器中,您只需要自己对收到的消息进行二进制到 XML 字符串的转换。你可以这样做:

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);
    }
}
于 2018-01-09T08:20:16.217 回答