关闭

单元测试中mock的使用及mock神器jmockit实践

发表于:2013-7-24 11:00

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:yydcj    来源:51Testing软件测试网采编

  这个是对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。


43/4<1234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号