Jmock 基本用法

code:

package com.citi;

public class Publisher {
	Subscriber subscriber;
	public void add(Subscriber subscriber){
		this.subscriber = subscriber;
	}
	public void publish(String message,int i){
		subscriber.receive(message);
		subscriber.withDraw(i);
		subscriber.receive(message);
	}
}

package com.citi;

public interface Subscriber {
	void receive(String message);
	void withDraw (int i) /*throws IllegalArgumentException*/;
}

package com.citi.test;

import org.jmock.Expectations;
import org.jmock.Mockery;
import org.junit.Test;

import com.citi.Publisher;
import com.citi.Subscriber;

public class PublisherTest{
		Mockery context = new Mockery();
		@Test
	    public void testOneSubscriberReceivesAMessage() {
	        final Subscriber subscriber = context.mock(Subscriber.class);
	        Publisher publisher = new Publisher();
	        publisher.add(subscriber);
	        final String message = "message";
	        /*atLeast(1).of (anObject).doSomething();
	        will(onConsecutiveCalls(
	            returnValue(10),
	            returnValue(20),
	            returnValue(30)));*/
	        context.checking(new Expectations() {{
	            /*oneOf (subscriber).receive(message);
	            oneOf (subscriber).receive(message);
	            oneOf (subscriber).receive(message);*/
	        	atLeast(1).of (subscriber).receive(message);
	        	   /*will(onConsecutiveCalls(
	        	       returnValue(10),
	        	       returnValue(20),
	        	       returnValue(30)));*/
	        }});
	        // execute
	        publisher.publish(message,1);
	        // verify
	        context.assertIsSatisfied();
	    }
		@Test
		public void testOneSubscriberReceivesAMessage02() {
			final Subscriber subscriber = context.mock(Subscriber.class);
			Publisher publisher = new Publisher();
			publisher.add(subscriber);
			 final String message = "message";
			 context.checking(new Expectations() {{
				 oneOf (subscriber).receive(message);
				 allowing (subscriber).withDraw(1); 
				    will(throwException(new IllegalArgumentException("you cannot withdraw nothing!")));
		        }});
			publisher.publish(message,1);
			context.assertIsSatisfied();
		}
		
		@Test
		public void testOneSubscriberReceivesAMessage03() {
			final Subscriber subscriber = context.mock(Subscriber.class);
			Publisher publisher = new Publisher();
			publisher.add(subscriber);
			 final String message = "messageTom";
			 context.checking(new Expectations() {{
				 oneOf (subscriber).receive(with(equal(message)));
				 //oneOf (subscriber).receive(message);
				 allowing (subscriber).withDraw(1); 
				    will(throwException(new IllegalArgumentException("you cannot withdraw nothing!")));
		        }});
			publisher.publish(message,1);
			context.assertIsSatisfied();
		}
}

每种Expectation都有下面类似结构:

invocation-count (mock-object).method(argument-constraints);
    inSequence(sequence-name);
    when(state-machine.is(state-name));
    will(action);
    then(state-machine.is(new-state-name));

对于连续的调用返回不同的值,可以这么写:

原来:

oneOf (anObject).doSomething(); will(returnValue(10));
oneOf (anObject).doSomething(); will(returnValue(20));
oneOf (anObject).doSomething(); will(returnValue(30));
现在:
atLeast(1).of (anObject).doSomething();
   will(onConsecutiveCalls(
       returnValue(10),
       returnValue(20),
       returnValue(30)));
上述示例也显示了方法抛出异常的情况.

下述例子演示了对方法参数的约束:

package com.citi;

public interface Manager04 {
	public String do04(String s1,String s2);
}

package com.citi;

public class Manager44 {
	private Manager04 manager04;

	public void setManager04(Manager04 manager04) {
		this.manager04 = manager04;
	}
	public String do44(String str1,String str2){
		return manager04.do04(str1, str2);
	}
}
package com.citi.test;

import junit.framework.Assert;

import org.jmock.Expectations;
import org.jmock.Mockery;
import org.junit.Test;

import com.citi.Manager04;
import com.citi.Manager44;

public class Manager44Test{
		Mockery context = new Mockery();
		@Test
	    public void testJmock02() {
	        final Manager04 manager04 = context.mock(Manager04.class);
	        final Manager44 manager44 = new Manager44();
	        manager44.setManager04(manager04);
	        context.checking(new Expectations() {{
	        	//oneOf (manager04).do04(with(aNull(String.class)), with(aNonNull(String.class))); 
	        	oneOf (manager04).do04(with(same("a")), with(aNonNull(String.class))); 
	        	will(returnValue("tom is a dog"));
	        }});
	        String s = manager44.do44("a","bb");
	        context.assertIsSatisfied();
	        Assert.assertEquals("tom is a dog", s);
	    }
}

with(aNull(String.class)), with(aNonNull(String.class))
约束了调用do04方法时的第一个参数可以为null,第二个参数不可以为空.

with(same("a")), with(aNonNull(String.class))
same约束了第一个参数必须是"a",才能正常调用do04方法.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值