1. 综述
Jmockit是一个mock框架,针对jmockit的介绍请查看http://www.taobaotest.com/blogs/2277,以下内容针对具体的使用场景进行介绍。
2. 普通方法的mock
测试代码
初始化代码
说明
初始化代码中
1. @Mocked 表示要mock一个SellerOrderOpenUtil类或LogicUtil类
2. methods = { "getEtcOrderOpenMap"}表示这个类里面的这个方法使用mock,其他方法不mock
3. inverse = false 表示反转,如果为true,则SellerOrderOpenUtil类中除了methods里面的方法不mock,其他方法都mock
测试代码中
1. new Expectations() 表示一个期望块
2. logicUtil.getSellerBySellerId(anyLong);要mock的方法
3. result = new EticketSeller(); 表示mock方法返回的值
4. times = 1; 表示该方法被调用几次
3. 调用protected方法
new Expectations(suitProcessor) {
{
this.invoke(suitProcessor, "suitETicket", 0L);
result = baseResult; // 也可以是returns(false);
times = 1;
}
};
其中suitProcessor为被测类
@Mocked(methods = { "suitETicket" })SuitSuccessProcessor suitProcessor = new SuitSuccessProcessor();
说明:
1. 因为被测方法中调用了本类中的其他方法,需要mock其他方法
2. 因为是protected的,所以需要通过反射的方式
4. 静态变量赋值
new Expectations(notifyUtil) {
{
this.setField(notifyUtil, "sendService", sendService);
sendService.sendETicket(123);
result = sendResult;
times = 1;
}
};
sendService定义如下
private static ISendService sendService;
@Mocked(methods = {"sendETicket"}, inverse = false) ISendService sendService;
@Mocked(methods = {"updateValidityVertical"}, inverse = false) NotifyUtil notifyUtil;
sendService是私有静态变量,需要通过setField的方式赋值
5. 被测方法中使用调用同一个方法两次
如果被测方法调用了同一个方法两次,如果两次直接没有需要mock的其他方法,则可以直接把times写为2,但是如果之间有需要mock的其他方法,则需要两次都进行mock
测试代码
6. 使用jmockit需要注意的事项
1. 引入jmockit包是jmockit的包的顺序要在junit之前
2. Mock一个对象,其实mock了整个类,该类的任何一个实例都被mock了
3. 用@mocked注解,这个类的父类及祖先类都被mock了
4. 一个期望块中可以mock多个不同类的方法,但是这些不同类的方法如果在同一个被测代码中,则mock顺序需要和源码中的顺序一致
5. Mock方法中的参数要和该代码实际执行时的参数一致
6. Mock方法中传递的参数必须和源码中传递的参数一致,也就是如果源码中传递了确定的一个值比如1,则在mock代码中也需要传递1,而不能是其他int类型,当然了,可以直接使用anyInt来代替,其他类似,对于object类型,可以使用any,强制转换为需要的类型。
转至:http://www.taobaotest.com/blogs/2292