1.引入Jacoco和Mocktio
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.8.0</version>
<scope>test</scope>
</dependency>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.7</version>
<executions>
<execution>
<id>default-prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>default-report</id>
<goals>
<goal>report</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
<configuration>
<!--定义代码覆盖率报告输出的文件夹-->
<outputDirectory>../target/site/jacoco</outputDirectory>
<!--执行数据的文件-->
<dataFile>${project.build.directory}/jacoco.exec</dataFile>
<!--要从报告中排除的类文件列表,支持通配符(*和?)。如果未指定则不会排除任何内容-->
<excludes>
<exclude>**/exchange/*</exclude>
<exclude>**/base/**</exclude>
<exclude>**/common/**</exclude>
<exclude>**/entity/*</exclude>
<exclude>**/enums/**</exclude>
<exclude>**/factory/**</exclude>
<exclude>**/feign/**</exclude>
<exclude>**/hrb/**</exclude>
<exclude>**/mapper/**</exclude>
<exclude>**/martech/**</exclude>
<exclude>**/mtb/**</exclude>
<exclude>**/request/**</exclude>
<exclude>**/response/**</exclude>
<exclude>**/toblottery/**</exclude>
<exclude>**/trans/**</exclude>
<exclude>**/vo/*</exclude>
<exclude>**/utils/*</exclude>
<exclude>org/apache/ibatis/logging/slf4j/**</exclude>
<exclude>**/mq/model/**</exclude>
<exclude>**/rabbitmq/config/**</exclude>
<exclude>**/rabbitmq/model/**</exclude>
<exclude>**/excel/poc/template/**</exclude>
<exclude>**/kafka/model/**</exclude>
</excludes>
</configuration>
</execution>
</executions>
</plugin>
2.Mockito测试类编写
import static org.mockito.Mockito.*;
// ... 导入必要的包
@RunWith(MockitoJUnitRunner.class)
public class CalculatorServiceTest {
@Mock
private CalculatorService calculatorService;
@Test
public void shouldReturnExpectedResultWhenAddTwoNumbers() {
// 给定条件 - 设置期望行为
when(calculatorService.add(10, 20)).thenReturn(30);
// 执行动作
calculatorService.add(10, 20);
}
}
2.Mybatis-Plus相关方法mock
1.xxxService.lambadQuery().list
// 源代码
List<SysUserInfo> sysUserInfo = sysUserInfoService.lambdaQuery().eq(SysUserInfo::getEmployeeName,"1111").list();
// mock后的代码
List<SysUserInfo> list = new ArrayList<>();
LambdaQueryChainWrapper<SysUserInfo> sysUserMapper = new LambdaQueryChainWrapper<>(mock(SysUserInfoMapper.class));
when(mockActivityService.lambdaQuery()).thenReturn(sysUserMapper);
when(sysUserMapper.list()).thenReturn(list);
2.调用私有方法
1.SysUserTokenCachedServiceImpl
@Service
public class SysUserTokenCachedServiceImpl implements SysUserTokenCachedService {
private Boolean setSysUserToken(SysUserTokenEntity sysUserTokenEntity) {
return Boolean.TRUE;
}
}
2.反射SysUserTokenCachedServiceImpl 中的私有方法
@Test
@SneakyThrows
void test_private_method() {
SysUserTokenCachedServiceImpl service = new SysUserTokenCachedServiceImpl();
//String.class表示参数的类型,有几个参数就写几个
Method method = SysUserTokenCachedServiceImpl.class.getDeclaredMethod("setSysUserToken", SysUserTokenEntity.class);
method.setAccessible(true);
SysUserTokenEntity sysUserTokenEntity = new SysUserTokenEntity();
method.invoke(service, sysUserTokenEntity);
}
3.启动maven-test 生成jacoco覆盖率文件
4.Jacoco源码覆盖标记
红色:这一行没有分支被执行
黄色:这一行只有部分分支被执行
绿色:这一行被分支执行了