单元测试是保证项目代码质量的有力武器,但是有些业务场景,依赖的第三方没有测试环境,这时候该怎么做Unit Test呢,总不能直接生产环境硬来吧?
可以借助一些mock测试工具来解决这个难题(比如下面要讲的mockito),废话不多说,直奔主题:
一、准备示例Demo
假设有一个订单系统,用户可以创建订单,同时下单后要检测用户余额(如果余额不足,提醒用户充值),具体来说,里面有2个服务:OrderService、UserService,类图如下:
示例代码:
package com.cnblogs.yjmyzz.springbootdemo.service.impl;
import com.cnblogs.yjmyzz.springbootdemo.service.UserService;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
/**
* @author 菩提树下的杨过
*/
@Service("userService")
public class UserServiceImpl implements UserService {
@Override
public BigDecimal queryBalance(int userId) {
System.out.println("queryBalance=>userId:" + userId);
//模拟返回100元余额
return new BigDecimal(100);
}
}
及
package com.cnblogs.yjmyzz.springbootdemo.service.impl;
import com.cnblogs.yjmyzz.springbootdemo.service.OrderService;
import com.cnblogs.yjmyzz.springbootdemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.math.BigDecimal;
@Service("orderService")
public class OrderServiceImpl implements OrderService {
@Autowired
private UserService userService;
/**
* 下订单
*
* @param productName
* @param orderNum
* @return
* @throws Exception
*/
@Override
public Long createOrder(String productName, Integer orderNum, int userId) throws Exception {
System.out.println("createOrder=>userId:" + userId);
if (StringUtils.isEmpty(productName)) {
throw new Exception("productName is empty");
}
if (orderNum == null) {
throw new Exception("orderNum is null!");
}
if (orderNum <= 0) {
throw new Exception("orderNum must bigger than 0");
}
//下订单过程略,返回1L做为订单号
Long orderId = 1L;
//模拟检测余额
BigDecimal balance = userService.queryBalance(userId);
if (balance.compareTo(BigDecimal.TEN) <= 0) {
System.out.println("余额不足10元,请及时充值!");
}
return orderId;
}
}
里面的逻辑不是重点,随便看看就好。关注下createOrder方法,最后几行OrderService调用了UserService查询余额,即:OrderService依赖UserService,假设UserService就是一个第3方服务,不具备测试环境,本文就来讲讲如何对UserService进行mock测试。
二、pom引入mockito 及 jacoco plugin
2.1 引入mockito
1 <dependency> 2 <groupId>org.mockito</groupId> 3 <artifactId>mockito-all</artifactId> 4 <version>1.9.5</version> 5 <scope>test</scope> 6 </dependency>