单元测试mock:用JMockit写单元测试实例

    在最近刚结束的接口开发项目中,由于和三方合作同时并行开发,所以开发过程中调用到第三方时,而此时第三方的接口还未实现,这时候我们要进行单元测试时,需要进行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; /** * 类名:
* 类说明:
* * @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; /** * 类名:
* 类说明:
* * @version V1.0 * @author lu7kang 2011-3-31 */ public class MyTestCase extends TestCase { @Test public void test() throws Exception{ // mock第三方接口方法-返回成功 MockUp mu3 = new MockUp() { @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测试的几点好处:

a、能够帮助我们解耦设计,即以接口设计为中心。

b、在使用其他对象的情况。通过为mock设置期望的行为,可以验证我们的代码是否正确。

c、使你的测试运行的更快。通过mock数据库,通等接口,我们可以避免耗时的连接。

d、可以推迟我们要实现的类。因为我们可以通过mock去模拟接口的实现,所以前期我们可以不用现实现接口。

e、可以测试那些不太容易发生,不太可能和一些异常情况,比如我们可以mock 抛出Exception。

你可能感兴趣的:(JAVA)