PowerMock 中如何使用mock类的构造函数

背景:

在日常编写代码的过程中,我们经常会在方法内部new很多的其他类对象来进行编码工作,那么对于这种情况怎么让new出来的对象是一个我们特意创建出来的一个mock实例,从而让我们能完全控制new出来的对象的所有行为呢?本文就来讲解下如何在powermock中mock类的构造函数。

技术实现:

首先我们先看下要被new的实例对象,如下所示:

public class Order {

    private Integer orderId;
    private Date createTime;

    public Order() {}

    public Order(Integer orderId, Date createTime) {
        this.orderId = orderId;
        this.createTime = createTime;
    }

    public void insertOrder() {
        throw new UnsupportedOperationException("this operate is not support");
    }

}

然后我们在创建一个服务类,服务类中会调用new方法创建对象,并调用new出来的对象的方法

public class OrderService {

    public void saveOrder(Integer orderId, Date createtime) {
        Order order = new Order(orderId, createtime);
        order.insertOrder();
    }

}

最后,我们再看下如何使用powermock的whenNew方法mock特定某个类实例的构造方法,让我们可以自由操作new返回的对象的行为

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import java.util.Date;

@RunWith(PowerMockRunner.class)
// 这里是调用构造方法的类,不是被mock构造函数的类本身
@PrepareForTest({OrderService.class})
public class OrderServiceTest {

    @Mock
    private Order order;

    @Test
    public void saveOrderWithConcreteArgumentsTest() throws Exception {
        Integer orderId = 10000;
        Date createtime = new Date();
        PowerMockito.whenNew(Order.class).withArguments(orderId, createtime).thenReturn(order);
        PowerMockito.doNothing().when(order).insertOrder();

        OrderService orderService = new OrderService();
        orderService.saveOrder(orderId, createtime);

        Mockito.verify(order).insertOrder();
    }

    @Test
    public void saveOrderWithAnyArgumentsTest() throws Exception {
        Integer orderId = 10000;
        Date createtime = new Date();
        PowerMockito.whenNew(Order.class).withAnyArguments().thenReturn(order);
        PowerMockito.doNothing().when(order).insertOrder();
        OrderService orderService = new OrderService();
        orderService.saveOrder(orderId, createtime);
        Mockito.verify(order).insertOrder();
    }


}

通过上面的powermock模拟实例的构造函数的例子,我们可以做到模拟类实例的创建

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值