欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

单元测试mock:用JMockit写单元测试实例,mockjmockit,在最近刚结束的接口开发项

来源: javaer 分享于  点击 43102 次 点评:143

单元测试mock:用JMockit写单元测试实例,mockjmockit,在最近刚结束的接口开发项


在最近刚结束的接口开发项目中,由于和三方合作同时并行开发,所以开发过程中调用到第三方时,而此时第三方的接口还未实现,这时候我们要进行单元测试时,需要进行mock操作,本次项目就是以JMockit框架来完成单元测试的。

JMockit 是一个轻量级的mock框架是用以帮助开发人员编写测试程序的一组工具和API,该项目完全基于 Java 5 SE 的 java.lang.instrument 包开发,内部使用 ASM 库来修改Java的Bytecode。

其使用方法也比较简单,以下就是具体的例子。

需要引用到的jar包:test.jmockit-0.998.jar 和 test.junit-4.5.jar

1、被测的方法doMyNumberProfile,该方法中调用到第三方接口updateNumberProfile。

package com.test.service.impl;  /**  * 类名:<br>  * 类说明:<br>  *   * @version V1.0  * @author lu7kang 2011-3-31  */  public class MyServiceImpl implements MyService {      private ESPService service;      public EFaxResult doMyNumberProfile(NumberProfile numberProfile, String memberId){          EFaxResult rst = new EFaxResult(ResultCode.RC_100);          //非空验证          validateNotEmpty(rst, "numberProfile", numberProfile);          validateNotEmpty(rst, "memberId", mainMemberId);          if(rst.getResultCode()!=ResultCode.RC_100) return rst;          .          .          .          .(省略)          .          .          try {              // 调用第三方接口              rst = service.updateNumberProfile(numberProfile, memberId);              .              .              .              .(省略)              .              .          } catch (Exception e) {              LOG.error(e);              rst.setResultCode(ResultCode.RC_101);              rst.setReturnObject(e.getMessage());          }          return rst;      }  }  

2、测试类,测试本地写好的doMyNumberProfile方法。其中第三方的updateNumberProfile方法是mock的。

package com.test;  import mockit.MockUp;  import org.junit.Test;  import junit.framework.TestCase;  /**  * 类名:<br>  * 类说明:<br>  *   * @version V1.0  * @author lu7kang 2011-3-31  */  public class MyTestCase extends TestCase {      @Test      public void test() throws Exception{          // mock第三方接口方法-返回成功          MockUp mu3 = new MockUp<ESPService>() {              @Mock              public EFaxResult updateNumberProfile(NumberProfile numberProfile, String memberId) {                   EFaxResult rst = new EFaxResult();                   // mock第三方方法-返回成功100                   rst.setResultCode(ResultCode.RC_100);                   return rst;              }          };          // 测试本地代码          MyService myservice = new MyServiceImpl();          NumberProfile numberProfile = new NumberProfile();          String memberId = "test_id";          // 测试自己的方法          rst = myservice.doMyNumberProfile(numberProfile, memberId);          Assert.assertEquals(ResultCode.RC_100, rst.getResultCode());      }  }  

总结使用mock测试的几点好处:

能够帮助我们解耦设计,即以接口设计为中心。在使用其他对象的情况。通过为mock设置期望的行为,可以验证我们的代码是否正确。使你的测试运行的更快。通过mock数据库,通等接口,我们可以避免耗时的连接。可以推迟我们要实现的类。因为我们可以通过mock去模拟接口的实现,所以前期我们可以不用现实现接口。可以测试那些不太容易发生,不太可能和一些异常情况,比如我们可以mock 抛出Exception。
相关栏目:

用户点评