Jmockit使用@MockUp控制被注入Service的方法

文章介绍了如何利用Jmockit的@MockUp注解来模拟被注入Service的方法,以便在单元测试中控制业务逻辑的执行路径,从而增加测试覆盖率。在示例中,通过模拟UserService的setUserId()方法,使得OrderService的if分支判断得以覆盖。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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())
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值