不同场景下的jmockit使用

2012-12-28  付民 

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

919°/9197 人阅读/0 条评论 发表评论

登录 后发表评论