连接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
相关产品推荐
相关产品推荐

