一、痛点问题
1.1、如何mock静态方法
1.2、mock很容易造成代码覆盖率的下降,如何提升代码覆盖率
二、准备工作
2.1、技术选型:powerMock
为何常见的Mockito不能mock静态方法?
因为Mockito使用继承的方式实现mock的,用CGLIB生成mock对象代替真实的对象进行执行,为了mock实例的方法,你可以在subclass中覆盖它,而static方法是不能被子类覆盖的,所以Mockito不能mock静态方法。
但PowerMock可以mock静态方法,因为它直接在bytecode上工作。PowerMock是一个JUnit扩展,它利用了EasyMock和Mockito模拟静态method的方法对Java中的静态method进行Mock。
2.2、maven依赖
<!-- mock 测试工具 -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.10.19</version>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.7.4</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.objenesis</groupId>
<artifactId>objenesis</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.7.4</version>
<scope>test</scope>
</dependency>
三、项目实战
3.1、需求
对上游的数据做数据验证,如果验证成功则落库,如果验证失败则发告警邮件通知上游的所有收件人(邮件组)。现在单元测试时候不能真的给上游邮件组全体发邮件,需要mock功能,而且为了单元测试的case可以反复执行,上游数据不能真的落库。做到上述的话,还需要尽可能的提升代码覆盖率(公司的高质量战略的要求:代码的行覆盖率需要达到50%以上,这也是研发对自己代码质量的要求)。
3.2、代码实战
@QmqConsumer(prefix = CommissionOrderConstants.orderConfirmTopic, consumerGroup = CommissionConstants.appId)
public void onMessage(Message message) {
log.info("receive commission order confirm's message.", message);
long startTime = System.currentTimeMillis();
try {
String data = message.getStringProperty("data");
QmqCommissionOrderConfirmVo commissionOrderConfirmVo = JSON.parseObject(data, QmqCommissionOrderConfirmVo.class);
this.handle(commissionOrderConfirmVo);
} catch (SQLException e) {
log.error("recei