今天使用jacoco分析系统覆盖率遇到一个问题,代码应当已经执行到了,但是用sonar始终显示未覆盖。
查看jacoco.exec文件,发现目标类有多个增强代理EnhancerBySpringCGLIB,如下图
分析代码可能通过Resource类注入Service,因Resource使用了cglib代理,执行service时,只执行到了代理类,而未执行到目标类,导致jacoco统计不到目标类的覆盖行。(Resource的覆盖率可以统计到,Service的覆盖率统计不到)
对比参考未使用CGLIB代理,而是使用Proxy代理的类,Jacoco则可以统计到覆盖行
同样,虽然使用了cglib代理,但是直接调用Service时,jacoco则可以统计到覆盖率。这也是为什么研发的单测可以统计到覆盖率,而集成测试时统计不到覆盖率的原因。(下图的Service可以直接调用,而不必通过Resource调用)