从jMock1自定义调用匹配器迁移到jMock2

时间:2015-08-06 15:24:17

标签: java unit-testing mocking jmock

我正在使用JMock-2.6.0。我有一个包含方法名称及其预期返回值的地图。 我想在使用JMock创建的模拟对象上调用一个方法。

之前我能够使用JMock 1,因为它遵循以下语法:

mockObj.stubs().method(mymap.getKey()).will(new ReturnStub(mymap.getValue()));

但我不确定,是否有办法使用JMock-2实现这一目标。

JMock-2的文档不足。

1 个答案:

答案 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());

    }
}