首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

jMock 学习札记

2012-11-03 
jMock 学习笔记1. 什么是Mock Object(模拟对象)。?我个人理解就是这些对象可能尚未实现,我们可以创建一个fa

jMock 学习笔记

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

MockObjects的选择:EasyMock与JMock的比较使用配置文件定义 Mock 对象,创建高效、灵活的测试用例?

源文档 <http://www.ibm.com/developerworks/cn/opensource/os-cn-easymock2/index.html>

?

?

热点排行