Jmockit使用@MockUp控制被注入Service的方法, 增加测试覆盖率
<!--jmockit版本-->
<dependency>
<groupId>org.jmockit</groupId>
<artifactId>jmockit</artifactId>
<version>1.36</version>
<scope>test</scope>
</dependency>
在我们为增加业务代码的覆盖率时, 会遇到一些if分支判断, 有时方法是没有返回值的, 所有我们不好通过模拟方法的返回值来让业务代码走到我们想要的分支中, 具体如下:
业务代码如下:
/**
* 被测试类:OrderService中使用了UserService的方法setUserId()
* if分支判断,会根据orderInfo.getUserId()是否有值进行不同的业务逻辑
* 此时userService.setUserId(orderInfo)是没有返回值的
*/
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private UserService userService;
@Override
public OrderInfo getOrderInfo(String orderId) {
OrderInfo orderInfo = new OrderInfo();
orderInfo.setOrderId(orderId);
userService.setUserId(orderInfo);
if (StrUtil.isNotBlank(orderInfo.getUserId())) {
System.out.println("用户信息已经加载");
} else {
System.out.println("未查询到用户信息");
}
return orderInfo;
}
}
/**
* 业务代码:setUserId()会对入参的OrderInfo对象进行修改
*/
@Service
public class UserServiceImpl implements UserService {
@Override
public void setUserId(OrderInfo orderInfo) {
orderInfo.setUserId("ZHANGSAN123");
}
}
测试案例一:
/**
* @author xinruoxiangyang9010
* 注意: UserService是被注入的,被测试类使用UserService的方法时不会执行真正的代码逻辑,
* 而是执行了默认方法
*/
@RunWith(JMockit.class)
public class OrderServiceImplTest {
@Injectable
private UserService userService;
@Tested
private OrderServiceImpl testService;
@Test
public void getOrderInfo1() {
testService.getOrderInfo("123");
}
}
/**
* 测试案例一,被测试类能执行了else分支,此时并不能覆盖if判断成功内的分支
* 控制台打印:"未查询到用户信息"
*/
if (StrUtil.isNotBlank(orderInfo.getUserId())) {
System.out.println("用户信息已经加载");
} else {
System.out.println("未查询到用户信息");
}
测试案例二:
/**
* @author xinruoxiangyang9010
* 使用new MockUp方法, 模拟被注入的对象UserService的setUserId()方法
* 控制台打印:"用户信息已经加载"
*/
@RunWith(JMockit.class)
public class OrderServiceImpl2Test {
@Injectable
private UserService userService;
@Tested
private OrderServiceImpl testService;
@Test
public void getOrderInfo2() {
new MockUp<UserService>(userService.getClass()) {
@Mock
public void setUserId(OrderInfo orderInfo){
orderInfo.setUserId("zhangsan123");
}
};
testService.getOrderInfo("123");
}
}
/**
* 测试案例二,被测试类能执行if判断成功的分支
* 控制台打印:"用户信息已经加载"
*/
if (StrUtil.isNotBlank(orderInfo.getUserId())) {
System.out.println("用户信息已经加载");
} else {
System.out.println("未查询到用户信息");
}
注意事项:
/**
* @author xinruoxiangyang9010
* 这里的参数必须是:userService.getClass()
* 如果写成UserService.class则@Mock里面的方法不生效
*/
new MockUp<UserService>(userService.getClass())