先说说JMock是用来干什么的,我觉得最简单的说,他就是用来模拟一个类,即使这个类根本没有实现。这个跟他的名字就比较像了。
举个例子吧,有一个Subscripter的类,他没有实现只有接口,我们有一个Publisher的类,这个类的测试,要用到这个传说中的Subscripter类,这个时候在没有实现,或者想减少测试干扰的时候,我们可以模拟Subscripter这个类。废话少说,实现这个例子吧:
1.建立一个工程,然后下载jmock,把如下的库加载到工程中(这里使用的是junit4的方法。)
- jmock-2.5.1.jar
- hamcrest-core-1.1.jar
- hamcrest-library-1.1.jar
- jmock-junit3-2.5.1.jar
- jmock-junit4-2.5.1.jar
2.要有Subscripter的接口定义:
interface Subscriber { void receive(String message); }
3.来实现我们的junit测试吧:
注意:
使用JMock模拟类的条件:
1、要有无参数的构造器;
2、构造器是public;
@RunWith(JMock.class) class PublisherTest { Mockery context = new JUnit4Mockery(); @Test public void oneSubscriberReceivesAMessage() { // set up 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); } }
这里说明一下:
final Subscriber subscriber = context.mock(Subscriber.class);
建立了一个虚拟的subscriber的类,然后替代它的方法:
context.checking(new Expectations() {{ oneOf (subscriber).receive(message); }});
看看执行效果,是不是已经被替代了。步骤就是这么简单。