本文档假设您已经熟练应用JUnit进行测试驱动的开发,并已经了解了使用MockObjects辅助测试。
HiMock用于生成mock对象,以方便您进行mock测试,它极其简单:我们使用了jmock的例子来描述一个publish/subscribe的过程。订阅者:
interface Subscriber { void receive(String message); }
我们希望测试在publisher发布后,给每个Subscriber发送消息
class TestPublisher extends TestCase { public void testPublishMessage() { ..... publisher.publish("hi himock"); assertEquals("hi himock",receiveMessage); } }
让我们看看一直使用的mock方式:实现Publisher接口:
public class TestPublisher extends TestCase{ String receiveMessage =null; public void testOldMockTestPublishMessage(){ //expectations class MockSubscriber implements Subscriber{ public void receive(String message) { receiveMessage = message; } } //set up Publisher publisher = new Publisher(); MockSubscriber mockSubscriber = new MockSubscriber(); publisher.add(mockSubscriber); // execute publisher.publish("hi mock"); //verify assertEquals("hi mock",receiveMessage); } }
在有些时候动态而不是实现接口可能更有效些:
public class TestPublisher extends TestCase{ public void testHiMockPublishMessage() { //expectations class SubscibeMocker{//没有实现Subscriber接口,HiMock把这种伪实现叫做mocker void receive(String aMessage){ "hi mock".equals(aMessage); } } //set up Publisher publisher = new Publisher(); HiMock hiMock = new HiMock(); Subscriber mockSubscriber = (Subscriber)hiMock.mock(Subscriber.class,new SubscibeMocker()); publisher.add(mockSubscriber); // execute publisher.publish("hi mock"); // verify hiMock.verify(); } }
哦,这看起来和我们以前用一个实现接口的类写mock测试很像,不过,现在更方便了,因为我们不必实现接口中所有的方法.
最后补上Publisher类
public class Publisher { List subscribers; public Publisher() { subscribers = new ArrayList(); } public void add(Subscriber subscriber) { subscribers.add(subscriber); } public void publish(String message) { for(int i=0;i<subscribers.size();i++) ((Subscriber)subscribers.get(i)).receive(message); } }