java为什么JaCoCo没有涵盖我的字符串开关语句?
我有一个switch
语句,它从String
中提取一个寻址模式,我编写了单元测试来涵盖所有可能发生的情况,但JaCoCo似乎跳过了我的switch
语句,导致覆盖率较低
为什么,如果我的所有case
语句(包括一个默认值)都在测试中执行,那么switch
语句不会被计算为命中
你可以在下面搜索框中键入要查询的问题!
我有一个switch
语句,它从String
中提取一个寻址模式,我编写了单元测试来涵盖所有可能发生的情况,但JaCoCo似乎跳过了我的switch
语句,导致覆盖率较低
为什么,如果我的所有case
语句(包括一个默认值)都在测试中执行,那么switch
语句不会被计算为命中
# 1 楼答案
用于按字符串切换
Oracle Java编译器生成的字节码与以下代码类似(Eclipse编译器for Java生成的字节码略有不同)
因此,具有6个大小写的原始switch语句在字节码中由一个具有6个大小写的switch语句加上5个if语句加上另一个具有6个大小写的switch语句表示。要查看此字节码,可以使用
javap -c
JaCoCo执行字节码分析,在低于0.8.0的版本中,没有按字符串切换的过滤器。您的测试包括if语句中的条件计算为
true
的情况,但不包括它们计算为false
的情况。就我个人而言,我建议忽略遗漏的情况,因为目标不是测试编译器是否生成正确的代码,而是测试应用程序是否正确运行。但为了这个答案的完整性,以下是涵盖所有字节码分支的测试:以及由JaCoCo 0.7.9生成的报告作为证据:
JaCoCo version 0.8.0 provides filters,包括
javac
按字符串为开关生成的字节码的过滤器。因此,即使没有其他测试,也会生成以下报告: