Java单元测试进阶之如何打桩(⽤easymock轻松打桩)打桩(mock)是单元测试的重要内容和难点,学好打桩的技术,做单元测试基本就没什么困难了。
mock有两种,⼀种是静态的,⼀种是动态的。静态的就是在写测试代码之前根据需要打桩的类⽣成另外⼀个类,这个类就是mock object。动态的就是mock object是在测试代码运⾏的时候才⽣成的。所以很明显,动态打桩⽐静态打桩要⽅便地多。本章就是介绍动态打桩的⼯具。
早期的动态mock⼯具只能够mock接⼝,⽽不能够mock类;现在的mock⼯具⽆论是mock接⼝还是类都能够轻松完成了。
easymock就是其中的佼佼者,easymock现在已经是2.2版本了,本⽂使⽤的是easymock1.2_Java1.5版本。使⽤easymock能够轻松的mock任何接⼝,但如果想mock类,那还需要另外⼀个lib,就是easymockclassextension,使⽤了这个⼯具,你就能轻松地mock你要的任何类了。本⽂使⽤的是easymockclassextension1.2,使⽤这个库必须要cglib这个jar包,⽽cglib⼜需要asm的jar包,所以要搭建好环境还得花些时间,不过当你把环境搞好之后,你便会发现物超所值,从此以后打桩⽆难事了。cglib和asm的版本⼀定要适配,要不然不能正常⼯作,幸好cglib的⽹站已经提供了cglib和asm的绑定包,本⽂所⽤的是cglib-nodep-2.2_beta1版本。
本章先对如何对接⼝进⾏打桩⽰例,下⼀章再对如何对接⼝进⾏打桩⽰例。
先看欲打桩接⼝代码:
/************************************************************
* Project Name: lhjTest
* File Name  : CoolInterface.java
* File Desc  : CoolInterface.java
* Author      : Administrator
* Create      : 2007-3-25
* Modify:
***********************************************************/
package l.junit;
/**
* @author Administrator
*/
public interface CoolInterface
{
String reverseString(String inputStr) throws NullPointerException;
}
该接⼝很简单,只要⼀个reverString的⽅法。
下⾯看看欲测试类(使⽤了CoolInterface)的代码:
/************************************************************
* Project Name: lhjTest
* File Name  : UseCoolInterface.java
* File Desc  : UseCoolInterface.java
* Author      : Administrator
* Create      : 2007-3-25
* Modify:
***********************************************************/
package l.mock;
import l.junit.CoolInterface;
/
**
* @author Administrator
*/
public class UseCoolInterface
{
private CoolInterface cool;
jdk怎么使用
public void setCoolInterface(CoolInterface cool)
{
}
public String reverseString(String inputStr) throws NullPointerException
{
verseString(inputStr);
}
}
这个类也很简单,相当于⼀个adapter。
下⾯看看如何使⽤easymock进⾏接⼝的打桩:
/
************************************************************
* Project Name: lhjTest
* File Name  : UseCoolInterfaceJTest.java
* File Desc  : UseCoolInterfaceJTest.java
* Author      : Administrator
* Create      : 2007-3-25
* Modify:
***********************************************************/
package l.mock;
import junit.framework.TestCase;
import org.easymock.MockControl;
import l.junit.CoolInterface;
import l.mock.UseCoolInterface;
/
**
* @author Administrator
*/
public class UseCoolInterfaceJTest extends TestCase
{
private UseCoolInterface testInterface;
private MockControl ctrl;
private CoolInterface cool;
/* (non-Javadoc)
* @see junit.framework.TestCase#setUp()
*/
protected void setUp() throws Exception
{
super.setUp();
ctrl = ateControl(CoolInterface.class);
cool = (CoolInterface) Mock();
testInterface = new UseCoolInterface();
testInterface.setCoolInterface(cool);
}
/* (non-Javadoc)
* @see junit.framework.TestCase#tearDown()
*/
protected void tearDown() throws Exception
{
}
/**
* Test method for {@link l.mock.UseCoolInterface#reverseString(java.lang.String)}.
*/
public void testReverseString()
{
try
{
fail();
}
catch (NullPointerException e)
{
//donothing
}
verseString(""));
assertEquals("aaAA", verseString("AAaa"));
assertEquals("AAaa", verseString("aaAA"));
ctrl.verify();
}
}
从上⾯可以看出使⽤easymock的步骤:
1、在setUp时创建MockControl,它是控制mock object⾏为的类,参数传⼊欲打桩的接⼝的class。
2、从mockControl中getmock,返回mock object转化为本类型对象。
3、创建欲测试类并将mock object传进去。
以上⼏步代码为:
ctrl = ateControl(CoolInterface.class);
cool = (CoolInterface) Mock();
testInterface =new UseCoolInterface();
testInterface.setCoolInterface(cool);
4、使⽤mockControl对mock object进⾏设置,这⼀步⼜称为训练,代码为
第⼀⾏意思是告诉mockControl,mock object的reverseString⽅法会被调⽤,传⼊的参数是null,并会抛出异常;第⼆⾏意思是告诉mockControl,mock object的reverseString⽅法会被调⽤,传⼊的参数是"",并返回null;其他⾏类似。
5、训练完之后可以接受检查了,代码为:
6、现在可以进⾏测试了,以下是测试代码:
try
{
fail();
}
catch (NullPointerException e)
{
//donothing
}
verseString(""));
assertEquals("aaAA", verseString("AAaa"));
assertEquals("AAaa", verseString("aaAA"));
可以看出,这跟⼀般的JUnit语句是⼀样的。
7、检验测试结果
ctrl.verify();
mockControl会验证mockObject是否按照训练的情况参与了测试,即训练时的⽅法是否被调⽤了,传⼊的参数对不对。
以上⽰例只是easymock的⼀部分功能,除此之外,easymock还能测试mockObject的⽅法是否按照顺序调⽤了,调⽤的次数对不对,传⼊的参数是否在给定的范围之内,另外还可以改变参数对象的内容。
除了easymock可以mock接⼝外,像mock objects,Jmock,mock Creator都可以实现此类功能。其中mock Creator还可以mock class,但是可惜mock creator是静态打桩的,实现起来有额外的⼯作。我在公司⾥⽤的是jdk1.4,⽆法⽤easymockclassextension1.2,所以使⽤了easymock加mock creator,幸好mock creator有eclipse插件,⽣成mock class也⽐较⽅便。所以如果你使⽤的是JDK1。4,⽤easymock加mock creator绝对是最佳组合;如果你使⽤的是JDK1.5,那么使⽤easymock加easymockclassextension会使你⼯作更轻松

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。