You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Citrus测试用例:验证前转换JMS二进制消息

在Citrus中转换JMS二进制消息后使用自带验证功能

完全理解你的痛点——自己实现BinaryMessageValidator确实麻烦,还没法用上Citrus自带的XML验证、XPath断言这些强大功能。既然你的二进制消息本质是XML,只是因为SUT的实现细节才以二进制发送,那我们可以先把二进制消息转换成字符串,再用Citrus的常规验证逻辑来处理,下面给你两种实用的方案:

方案1:自定义消息转换器(全局/端点级复用)

你可以实现一个MessageConverter,专门把二进制的byte[] payload转换成XML字符串,然后把这个转换器配置到JMS端点或者接收动作中,这样后续的验证就和普通XML消息完全一致了。

实现转换器

import org.springframework.messaging.Message;
import org.springframework.messaging.MessageConverter;
import org.springframework.messaging.support.MessageBuilder;
import java.nio.charset.StandardCharsets;

public class BinaryToXmlConverter implements MessageConverter {
    @Override
    public Message<?> convertInbound(Message<?> message) {
        // 仅处理二进制payload
        if (message.getPayload() instanceof byte[]) {
            byte[] binaryPayload = (byte[]) message.getPayload();
            // 注意:如果SUT用的不是UTF-8,替换成对应字符集,比如ISO_8859_1
            String xmlPayload = new String(binaryPayload, StandardCharsets.UTF_8);
            // 构建新消息,保留原headers
            return MessageBuilder.withPayload(xmlPayload)
                    .copyHeaders(message.getHeaders())
                    .build();
        }
        return message;
    }

    @Override
    public Message<?> convertOutbound(Message<?> message) {
        // 如果不需要发送二进制消息,直接返回原消息即可
        return message;
    }
}

在接收动作中使用

配置好转换器后,你就可以直接用Citrus自带的XmlMessageValidator或者直接写XML payload断言了:

runner.receive(action -> action.endpoint("myJmsEndpoint")
        .messageConverter(new BinaryToXmlConverter())
        // 这里可以直接用Citrus的XML验证器,或者省略让Citrus自动识别
        .validator(new XmlMessageValidator())
        .payload("<root><data>expectedValue</data></root>")
        // 还能用上XPath断言
        .validate("/root/data", "expectedValue"));

方案2:接收时直接转换(单次使用)

如果这个转换只在个别测试用例里需要,你可以直接在接收动作中用transformer方法即时转换payload,不用单独写转换器类:

runner.receive(action -> action.endpoint("myJmsEndpoint")
        .messageType(MessageType.BINARY)
        .transformer(message -> {
            byte[] binaryPayload = (byte[]) message.getPayload();
            String xmlPayload = new String(binaryPayload, StandardCharsets.UTF_8);
            return MessageBuilder.withPayload(xmlPayload)
                    .copyHeaders(message.getHeaders())
                    .build();
        })
        // 转换完成后,所有Citrus的常规验证都能用
        .validate("/root/data", "expectedValue"));

这两种方案都能帮你跳过自定义验证器的麻烦,直接复用Citrus的原生验证能力,完美适配你的场景——毕竟消息本质是XML,只是穿了二进制的"外衣"而已。

内容的提问来源于stack exchange,提问作者burki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:40:39