这个是对refundmanager里面查询可退款金额范围 queryRefundFeeRange的单元测试。通过看被测代码可以看到这个方法的实现里面调用了

  feeResultDO = confirmGoodsService.queryConfirmToSellerRefundFee(detailId);

  这个外部的hsf依赖 获取了feeResultDO 。

  这个hsf调用是需要mock的。

  传统的mock或ut ,对 confirmGoodsService 这个bean是需要初始化,通过spring的配置,初始化加载等 一大堆代码。

  jmockit通过了注解的方式:

@Injectable
private ConfirmGoodsService confirmGoodsService ;

  一个Annotation搞定了所有的配置,加载等问题。直接复用开发代码里面的bean,节省了大量的代码。

  另外  @Tested  RefundManagerImpl refundManagerImpl = new RefundManagerImpl();

  这里也用到了注解 @Tested   表示被测试的class 。

  另外还有常用的注解:@Mocked,@NonStrict等。

  而这段代码是mock的核心:录制被mock的method的行为及期望返回:

new Expectations(){
{
confirmGoodsService.queryConfirmToSellerRefundFee(anyLong);
result = feeResultDOmock;
times = 1;
}
} ;

  其中

  result  可以返回任意需要的测试类型;

  times  表示期望被调用的次数。

  是不是看起来非常简洁明了。

  而上面该段代码如果 换成基于状态的mockup 代码如下:

  采用MockUp的方式,可以mock任意的mock对象或方法,因为它直接改写了原method的实现逻辑,直接返回需要的数据。

  这也是jmockit彪悍的地方之一。

  后数据回收,防止各个testcase的mock相互影响的方式:

  Mockit.tearDownMocks();

  这一步也可以省略。

  还要重点介绍的是mock期望里面的入参 any。