背景:
在日常编写代码的过程中,我们经常会在方法内部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模拟实例的构造函数的例子,我们可以做到模拟类实例的创建