Java使用Mockito&PowerMockito进行单测

1. 开始

首先说明单测的意义:单测是为了校验自己的代码逻辑是否正确,那有同学说了,我直接调用自己写的方法不就得了。
随着服务的划分,我们的代码会依赖不同的服务,及时不调用其他服务,也会有mysql、redis等一些数据,在跑测试的时候
要准备这些环境是不方便的(主要是前者,有的测试环境不稳定),我们便可以使用Mock的方法,将我们依赖的第三方服务Mock掉
(也就是屏蔽掉,不会真的去调用我们依赖的环境)。这样就能很爽的对自己的逻辑进行测试了。

引入Mockito和PowerMockit的maven坐标,PowerMokito是对Mockito的增强,覆盖了mockito不能完成的case

2.如何使用

talk is cheap,show my code

直接放上demo github链接 https://github.com/yangzhenkun/MockDemo

这里对关键的 @InjectMocks@Mock两个注解进行说明。

@InjectMocks在你需要进行单测的类上打上该注解

@Mock在你需要mock(屏蔽)的类上打上该注解,例如一些rpc调用、mysql读写等。

@Spy可以将自己的对象实例注入到业务代码中

里面例子覆盖了一个简单方法的mock,无返回值方法的mock,静态方法的mock,web controller的mock

代码中都是使用注解进行注入的,但是这个bean管理和spring ioc是没有任何关系的。

3. 使用jacoco查看单测覆盖率

在主module和被依赖module的pom增加jacoco的plugin,具体可以参考GITHUB代码

PS: 一般后端项目的web层为主module,如果我们一些子module不会在web层里面直接引用,是无法收集到单测报告的。
简单说就是 想要统计子module的单测覆盖率,主module必须直接引用,并且子module中添加plugin。

如果项目中有很多子module,有些module并不是直接被主module引用,此时推荐 创建一个 ut module,该module把所有想统计单测的
子module直接依赖进去即可。

直接运行

mvn clean install -DskipTests=false -Dmaven.test.failure.ignore=true

即可执行单测并生成单测报告(注意,所有的单测类已Test结尾)。

可以如果我们的java项目是多module依赖的,需要增加多模块的execution(主module pom中已经给出),子module也需要增加jacoco的plugin。

单测跑完后,会生成/target/site/jacoco 、 /target/site/jacoco-aggregate/ 两个文件夹,前者是主module本身的单测,后者是依赖module的单测结果(多个依赖module都在这个目录下)。同时也可以看到indexz.html,里面有个lines列,就可以看到你的行覆盖率了

你可能感兴趣的:(java)