TestNG校验SOAP响应时预期字符串连字符被替换为乱码问题
问题原因
你代码里写的那个看着像连字符的字符,根本不是普通ASCII半角减号/连字符-,是Unicode短破折号–(编码U+2013)。出现乱码的核心原因是编码不匹配:
- 你的Java源文件保存编码和编译时指定的编码不一致,这个占2个字节的短破折号被错误解析,变成了Unicode替换字符
▒(U+FFFD,就是你看到的乱码块) - SOAP服务实际返回的是编码正确的短破折号,两边字符串比对自然不通过,TestNG输出的预期值里就显示成了乱码。
修复方法
二选一即可,优先选第一种,一劳永逸不会踩编码坑:
- 方法1:不要在代码里硬写这个特殊破折号,直接用Unicode转义序列代替。把
<faultstring>和<ns2:LogMessage>两处的–全部替换成\u2013,不管源文件用什么编码保存,Java编译后都能正确识别这个字符,不会出现乱码。
对应修改后的代码片段:"<faultstring>Request Rejected \u2013 Old and New Adjuster Code are same on claim.</faultstring>\n" + "<ns2:LogMessage>Request Rejected \u2013 Old and New Adjuster Code are same on claim.</ns2:LogMessage>\n" + - 方法2:统一全链路编码。把所有Java源文件保存为UTF-8格式,同时给构建工具配置明确指定编译编码为UTF-8。Maven项目就在pom.xml里加如下配置:
如果是直接在IDE里跑测试,把IDE的全局编码、项目编码、配置文件编码全部改成UTF-8,避免编译读文件时解析错字符。<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties>
排查建议
以后遇到这种肉眼看着一样但比对不通过的情况,直接把两边对应位置的字符转成Unicode码值打印出来对比,不要靠肉眼分辨,很多长得像的特殊字符(比如全角破折号、半角减号、长破折号、短破折号)视觉上几乎没区别,码值差得很远。
内容的提问来源于stack exchange,提问作者danilo
相关产品推荐
相关产品推荐

