最近在写单元测试,用到了PowerMock,测试覆盖率的时候碰到一个奇怪的问题,有几个类用idea的JaCoCo插件测试覆盖率为0,但用idea自己的插件测没问题,网上找了下,原来是JaCoCo和PowerMock冲突了,JaCoCo会忽略注解@PrepareForTest({})里面的类,解决办法是用JaCoCo的离线模式。
产生问题的代码如下
@RunWith(PowerMockRunner.class)
@PrepareForTest({UserService.class,UserUtil.class})
public class UserServiceTest {
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void findall() {
//单元测试代码
}
}
注意看,测试的是UserService类,但是@PrepareForTest({UserService.class,UserUtil.class})里面又有UserService.class,那么JaCoCo就会忽略UserService,测出的这个类的覆盖率自然为0,用JaCoCo的On-the-fly模式 测试也会为0,解决办法是要用JaCoCo的离线模式(Offline Instrumentation)。
具体maven配置样例如下:官方
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.powermock</groupId>
<artifactId>powermock-examples</artifactId>