本文来自我的独立blog,原文链接:http://www.wangyuxiong.com/archives/51489
Mock的概念还是比较简单的,相当于真实的对象的替身,它实现了测试中用到的接口,并给接口中的方法设置测试需要返回的值。
现在有多种用来方便地动态生成Mock对象的Java API:如Easy Mock,JMock,DynaMock等。
1. 搭建Jmock的环境
1.1 目前比较稳定的jmock版本是2.5.1,支持java 5 + 版本。可以从官网下载该版本。
下载地址:http://www.jmock.org/download.html
为了使用jmock ,我们必须先要引用下面四个jar包:如图所示
- jmock-2.5.1.jar
- hamcrest-core-1.1.jar
- hamcrest-library-1.1.jar
- jmock-junit4-2.5.1.jar

1.2 准备好被mock的接口,添加好一个interface接口,代码如下
public interface Subscriber {
void receive(String message);
}
1.3 准备好接口的实现类,代码如下:
package com.lifeware.mocksample;
public class SubscriberImpl implements Subscriber{
public String msg = "";
public void receive(String message){
msg = message;
}
}
1.4 最后,我们还需要一个publisher类
package com.lifeware.mocksample;
import java.util.*;
public class Publisher {
List<Subscriber> subs = new ArrayList<Subscriber>();
public void add(Subscriber sub){
subs.add(sub);
}
public void publish(String message){
for(int index=0;index<subs.size();index++){
Subscriber sub = subs.get(index);
sub.receive(message);
}
}
}
1.5 上述的代码结构如下,我们将其存放在src文件下:
2. 编写TestCase
2.1 新增一个junit的testcase类,在使用jmock之前,我们需要import一些jmock的类以及创建一个"Mockery”对象。
import static org.junit.Assert.*;
import org.junit.Test;
import org.junit.runner.*;
import org.jmock.Expectations;
import org.jmock.Mockery;
import org.jmock.integration.junit4.JMock;
import org.jmock.integration.junit4.JUnit4Mockery;
@RunWith(JMock.class)
public class PublisherTest {
JUnit4Mockery context = new JUnit4Mockery();
}
2.2 添加一个测试方法:
@Test
public void oneSubscriberReceivesAMessage() {
final Subscriber subscriber = context.mock(Subscriber.class);
Publisher publisher = new Publisher();
publisher.add(subscriber);
final String message = "message";
// expectations
context.checking(new Expectations() {{
oneOf (subscriber).receive(message);
}});
// execute
publisher.publish(message);
}
上面的代码中貌似没有明确的verify代码.但实际上,如果mock的Subscriber 的调用与期望的不符,该case会失败的。JMock test runner 会自动去执行这个验证过程。
3. case执行:
Run as –>Junit Test, 结果如下: