我们都有这种经验,测试在我们软件编码过程中占据了大部分时间,有时候觉得软件业务代码好写,但测试代码却难写了,单元测试是把自己的代码交托给测试同学和其他同学前的承诺。
为了获得更好的代码质量,我们一般都会用几好种工具,其中FindBugs和Emma(http://update.eclemma.org)就是常用的。
在测试与其它系统有交互的功能块,并且其它系统的稳定性未知的情况下,Mock就得派上用场了,否则测试起来极其吃力,并且效率低下。
下面简单介绍下两种Mock测试框架:JMockhttp://www.jmock.org和Mockitohttp://www.mockito.org。
一、前提说明
两个类:一个被Mock的对象(MayMockObject),一个被测试的对象(MainTstObject)。
很明显,我们的任务是测试MainTstObject,而该类引用了MayMockObject,为了测试的进行,我们模拟MayMockObject的实例。
测试用例类:MainTstObjectJMockTest和MainTstObjectMockitoTest。
二、依赖加入
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> <version>4.4</version> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-all</artifactId> <scope>test</scope> <version>1.8.5</version> </dependency> <dependency> <groupId>jmock</groupId> <artifactId>jmock</artifactId> <scope>test</scope> <version>2.5.1</version> </dependency> |
当然,如果工程不是基于Maven构架的,可以直接加入相应的Jar也行。
三、外接接口(将被Mock的对象)
public interface MayMockObject { public String getString(String str); } |
public class MainTstObject { private MayMockObject mayMockObject; // 引用了外接接口 public String create(String str1, String str2) { return str1 + this.mayMockObject.getString(str2); } public void setMayMockObject(MayMockObject mayMockObject) { this.mayMockObject = mayMockObject; } } |
五、JMock的测试用例
public class MainTstObjectJMockTest { private Mockery context = new JUnit4Mockery(); private MayMockObject mayMockObject; private MainTstObject mainTstObject; @Before public void setUp() { this.mayMockObject = this.context.mock(MayMockObject.class); // Mock了外接接口 this.mainTstObject = new MainTstObject(); this.mainTstObject.setMayMockObject(this.mayMockObject); } @Test public void process() { final String str1 = "Mockito返回字符串。"; final String str2 = "Mockito返回字符串。"; this.context.checking(new Expectations() { { oneOf(mayMockObject).getString(str2); will(returnValue("")); // Mock返回值 // allowing(mayMockObject).getString(with(any(String.class))); // will(returnValue("")); } }); String ret = this.mainTstObject.create(str1, str2); Assert.assertEquals(ret, str1); } @After public void tearDown() { } } |