1. 什么是Mock Object(模拟对象)。
我个人理解就是这些对象可能尚未实现,我们可以创建一个fake 的对象来实现行为与特性。
好比我们要编写一个声控电灯的程序一样,我们手头没有暂时没有灯泡设备。
那么我们便构建一个模拟的灯泡,方便对程序可以正常编写逻辑。
如:
灯泡的接口:
public interface ILight{
boolean open();
boolean close();
}
灯泡的模拟对象
public interface MockLight implements ILight{
boolean open(){
System.out.println("open the MockLight");
return true;
}
boolean close(){
System.out.println("close the MockLight");
return true;
}
}
通过这个模拟的灯泡,我们可以来实现遇到声音时,打开灯泡的程序
public class SoundController{
public static boolean receiveSound(){
return true;
}
public static void main(String[] args){
ILight light = new MockLight();
while(true){
if(SoundController.receiveSound() == true){
light.open();
}
}
}
}
2. 为什么要使用模拟对象。
jmock通过mock对象来模拟一个对象的行为,从而隔离开我们不关心的其他对象,使得单元测试的编写变得更为可行,也使得TDD变得更为方便,自然而然的,也就成为敏捷开发的一个利器。 (引用自:主题:jmock2.5基本教程)
3. 如何使用jmock
官方的入门示例: http://www.jmock.org/jmock1-getting-started.html
(以下是摘要)
订阅者接口
interface Subscriber { void receive(String message); }
针对订阅者的单元测试
import org.jmock.*; class PublisherTest extends MockObjectTestCase { public void testOneSubscriberReceivesAMessage() { } }
接下来,我们获取一个Subscriber 的模拟对象,并添加到发布者的订阅列表中。
Mock mockSubscriber = mock(Subscriber.class); Publisher publisher = new Publisher(); publisher.add( (Subscriber)mockSubscriber.proxy() ); final String message = "message";
编写模拟对象的模拟行为,期待调用一次receive 方法 且参数为message
mockSubscriber.expects(once()).method("receive").with( eq(message) );
执行我们想要的测试方法:
publisher.publish(message);
当测试执行完成时,jMock 会判断 Subscriber 是否会像 expects 方法中编写的那样被调用,如果与expects期待的方法不匹配,便使测试失败。
完整的测试代码
import org.jmock.*; class PublisherTest extends MockObjectTestCase { public void testOneSubscriberReceivesAMessage() { // set up Mock mockSubscriber = mock(Subscriber.class); Publisher publisher = new Publisher(); publisher.add((Subscriber) mockSubscriber.proxy()); final String message = "message"; // expectations mockSubscriber.expects(once()).method("receive").with( eq(message) ); // execute publisher.publish(message); } }
4. jmock 的实现原理。
待续。。。
参考
官方的入门文档:http://www.jmock.org/jmock1-getting-started.html
使用模拟对象(Mock Object)技术进行测试驱动开发 http://www.ibm.com/developerworks/cn/java/j-lo-mockobject/
EasyMock 使用方法与原理剖析 http://www.ibm.com/developerworks/cn/opensource/os-cn-easymock/
主题:jmock2.5基本教程 http://www.iteye.com/topic/770438
源文档 <http://www.ibm.com/developerworks/cn/opensource/os-cn-easymock2/index.html>