IntelliJ中Spock含超长元素列表的断言未失败问题问询
问题根源:IntelliJ IDEA测试结果解析器的Bug
这完全不是Spock或者Groovy的问题,而是IntelliJ 2017.3版本里处理测试失败消息的解析器有缺陷,具体原因拆解如下:
1. 你的断言本质上必然失败
不管用==还是equals,这个测试的逻辑结果肯定是失败的——60万个'a'拼成的字符串绝对不可能等于'b'。命令行运行测试能正常失败,就证明Spock本身正确执行了断言,并且输出了失败信息。
2. IntelliJ解析失败消息时崩溃了
从你提供的idea.log里的ParseException可以清楚看到:
- 当Spock处理超长字符串的断言失败时,会输出TeamCity格式的服务消息,其中包含长字符串差异提示(比如
Strings too large to calculate edit distance.),还会生成临时文件存储实际的超长字符串 - 但这个消息的格式存在转义问题,导致IntelliJ的
ServiceMessage解析器无法正确解析,直接抛出了异常 - 解析器崩溃后,IntelliJ没有正确处理这个失败事件,反而错误地把测试标记为"通过"了
3. 为什么equals版本能正常失败?
因为调用equals()时,Spock输出的失败信息更简单——直接返回了false,没有触发超长字符串的特殊处理逻辑,生成的TeamCity消息格式是IntelliJ能正确解析的,所以能正常显示失败结果。
解决方法
临时 workaround:
- 避免直接在断言里写超长字符串的拼接,先把长字符串存到变量里再对比:
def "fixed assertion"() { given: def longString = 'a' * 600_000 expect: longString == 'b' } - 或者直接改用
equals()方法(就像你已经发现的那样)
长期修复:
升级你的IntelliJ IDEA到2018.x或更高版本——这个解析器的Bug在后续版本中已经被官方修复了,升级后就能正常识别这类超长字符串的断言失败。
内容的提问来源于stack exchange,提问作者Michal Kordas
相关产品推荐
相关产品推荐

