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方法. 版权声明:本文为u014452858原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。