PowerMock 底层用的是 Javassist 来修改字节码的,按 贝壳产品技术 跳跳虎 的 《JavaAgent原理与实践》这篇文章里 4.2 节的描述,因为 ClassPool 始终从文件系统加载 class 文件,导致如果有其它 java agent 修改了内存中的字节码,就会被丢掉。而 jacoco 刚好是这样做的。

所以只能用 jacoco offline 来绕过这个问题,不过注意 pom.xml 的写法要参考这里,要点是

  1. 显式设置 jacoco-agent.destfile 放到target目录里,不然会由于执行时当前目录的问题,被放在项目根目录下面,导致其它环节都找不到
  2. jacoco:restore-instrumented-classes 要在 jacoco:report 之前,这样才能正常生成html报告,可以把这两个的phase都设置成test这样就会挨个执行了