我正在使用JMock-2.6.0。我有一个包含方法名称及其预期返回值的地图。 我想在使用JMock创建的模拟对象上调用一个方法。
之前我能够使用JMock 1,因为它遵循以下语法:
mockObj.stubs().method(mymap.getKey()).will(new ReturnStub(mymap.getValue()));
但我不确定,是否有办法使用JMock-2实现这一目标。
JMock-2的文档不足。
答案 0 :(得分:0)
我相信this是您一直在寻找的文档:
匹配对象或方法
虽然匹配器通常用于指定可接受的参数值,但它们也可用于指定可接受的对象 或期望中的方法,使用类似于的API语法 jMock 1.为此,请使用您通常会引用的匹配器 直接在调用count子句中的mock对象。然后链 一起约束以定义预期的调用。
他们的例子包括:
允许在任何模拟对象上调用任何bean属性getter:
allowing (any(Object.class)).method("get.*").withNoArguments();
例如,您可以在循环中使用以下allowing
...部分来获得类似的结果。
样本测试:
接口:
public interface ThingOneI {
public abstract String getData();
public abstract void setData(String data);
public abstract String getRequest();
public abstract void setRequest(String request);
}
默认地将Impl:
public class ThingOne implements ThingOneI {
private String data;
private String request;
public ThingOne() {
}
@Override
public String getData() {
return data;
}
@Override
public void setData(String data) {
this.data = data;
}
@Override
public String getRequest() {
return request;
}
@Override
public void setRequest(String request) {
this.request = request;
}
}
Junit测试:
import org.jmock.Expectations;
import org.jmock.Mockery;
import org.junit.Before;
import org.junit.Test;
public class ThingOneTest {
Mockery context = new Mockery();
@Before
public void setUp() throws Exception {
}
@Test
public void test() {
ThingOneI thingOne = context.mock(ThingOneI.class);
Map<String, String> methMap = new HashMap<String, String>();
methMap.put("getData", "5");
context.checking(new Expectations() {{
for (Map.Entry<String, String> entry : methMap.entrySet())
allowing(any(ThingOneI.class))
.method(entry.getKey())
.with(any(String.class));
will(returnValue(entry.getValue()));
}
}});
System.out.println(thingOne.getData());
}
}