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

连接IBM队列时触发AssertionError的问题排查求助

解决Java 17下Cucumber测试IBM MQ时的AssertionError问题

问题场景

  • Java 17环境,Cucumber测试连接IBM MQ时触发AssertionError
  • 直接运行特性文件或移除VM选项中的断言配置(-ea)可正常执行,但通过Maven命令(mvn clean install)或pom.xml配置跳过断言无效

报错堆栈:

java.lang.AssertionError
        at com.ibm.msg.client.wmq.common.internal.WMQPropertyContext.getStringProperty(WMQPropertyContext.java:390)
        at com.ibm.msg.client.wmq.common.internal.StringableProperty.resolve(StringableProperty.java:137)
        at com.ibm.msg.client.wmq.common.internal.StringableProperty.jsonIfy(StringableProperty.java:129)
        at com.ibm.msg.client.wmq.internal.WMQSession.toJson(WMQSession.java:2162)
        at com.ibm.msg.client.jms.internal.JmsSessionImpl.toJson(JmsSessionImpl.java:6097)
        at com.ibm.mq.jms.MQSession.toString(MQSession.java:1476)
        at java.base/java.lang.String.valueOf(String.java:4218)
        at java.base/java.lang.StringBuilder.append(StringBuilder.java:173)
        at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:502)
        at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:584)

原因分析

这个断言错误是IBM MQ客户端内部代码触发的,根源是MQSession.toString()方法调用时触发了内部断言。Java 17对断言的处理逻辑,加上Maven测试插件的参数传递机制,可能导致你设置的跳过断言参数没有生效到Cucumber测试的JVM进程中。

解决方案

1. 配置Maven Surefire插件传递断言禁用参数

在pom.xml的build/plugins中添加Surefire插件配置,明确给测试JVM传递-da(禁用断言)参数:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>3.2.5</version> <!-- 建议用最新稳定版 -->
            <configuration>
                <argLine>-da</argLine>
                <!-- 如果有其他JVM参数(比如模块相关),直接合并:<argLine>-da --add-modules java.se.ee</argLine> -->
            </configuration>
        </plugin>
    </plugins>
</build>

2. 修正IDE的Maven运行配置

如果是在IDE中执行Maven命令,要确保VM选项里加上-da:

  • 以IntelliJ为例:打开Run/Debug Configurations,找到对应的Maven配置(比如clean install),在VM options中添加-da

3. 临时规避:避免触发MQSession的toString方法

如果上述配置无效,可以手动修改消息发送逻辑,避免框架隐式调用toString():

import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.SessionCallback;
import javax.jms.Session;

// 手动控制Session使用逻辑,跳过默认toString调用
jmsTemplate.execute((SessionCallback<Void>) session -> {
    jmsTemplate.send(session -> {
        // 在这里编写创建消息的逻辑
    });
    return null;
});

4. 升级IBM MQ客户端版本

该断言问题可能是客户端的已知bug,升级到最新版本大概率能解决:

<dependency>
    <groupId>com.ibm.mq</groupId>
    <artifactId>com.ibm.mq.allclient</artifactId>
    <version>9.3.4.0</version> <!-- 替换为最新可用版本 -->
</dependency>

验证

执行mvn clean test,检查AssertionError是否消失,同时确认MQ消息收发功能正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 22:56:29