Java easymock对模拟对象的方法的参数设置期望值

Java easymock对模拟对象的方法的参数设置期望值,java,unit-testing,easymock,Java,Unit Testing,Easymock,我不知道如何与easymock建立这种行为。为了说明这一点,我创建了一个简化的示例。 基本上,我有一个返回void的方法,并获取一个映射,我希望easymock更改映射,删除我指定的条目 假设我有以下接口: public interface Filter{ public void filter(Map<String,String>map); } 公共接口过滤器{ 公共空隙过滤器(Mapmap); } 以及以下类别: public class MyClass {

我不知道如何与easymock建立这种行为。为了说明这一点,我创建了一个简化的示例。 基本上,我有一个返回void的方法,并获取一个映射,我希望easymock更改映射,删除我指定的条目

假设我有以下接口:

public interface Filter{
    public void filter(Map<String,String>map);    

}
公共接口过滤器{
公共空隙过滤器(Mapmap);
}
以及以下类别:

public class MyClass {
    private Filter filter;
    public MyClass(Filter filter) {
        this.filter = filter;
    }
    public Map<String,String> process(Map<String,String>map) {
       filter.filter(map);
       return map;
    }
}
公共类MyClass{
专用滤波器;
公共MyClass(筛选器){
this.filter=过滤器;
}
公共地图流程(Mapmap){
filter.filter(map);
返回图;
}
}
我不知道如何设置此行为:

public class MyClassTest {

    /**
     * Test method for {@link easy.MyClass#process(java.util.Map)}.
     */
    @Test
    public void testProcess() {
        Map<String, String> map = new HashMap<String, String>();
        map.put("one","AAA");
        map.put("remove","BBB");
        map.put("three","CCC");
        Map<String, String> expectedRet = new HashMap<String, String>();
        expectedRet.put("one","AAA");
        expectedRet.put("three","CCC");


        IMocksControl mockery = EasyMock.createControl();
        mockery.resetToStrict();
        mockery.checkOrder(true);

        Filter mockFilter = mockery.createMock("filter", Filter.class);
        MyClass m = new MyClass(mockFilter);
        mockFilter.filter(map);
        // I would like some behaviour that will remove the entry ("remove","BBB")
        // how can I define that?

        mockery.replay();
        m.process(map);        
        mockery.verify();

        assertEquals(expectedRet,map);

    }

}
公共类MyClassTest{
/**
*{@link easy.MyClass#process(java.util.Map)}的测试方法。
*/
@试验
公共void testProcess(){
Map Map=newhashmap();
地图放置(“一”、“AAA”);
地图放置(“移除”、“BBB”);
地图放置(“三”、“CCC”);
Map expectedRet=newhashmap();
预期违约概率(“一”、“AAA”);
预期违约概率(“三”、“CCC”);
IMocksControl mockry=EasyMock.createControl();
mocky.resetToStrict();
嘲弄。核对顺序(正确);
Filter mockFilter=mockry.createMock(“Filter”,Filter.class);
MyClass m=新的MyClass(mockFilter);
mockFilter.filter(map);
//我希望有一些行为会删除条目(“删除”、“BBB”)
//我如何定义它?
mockry.replay();
m、 工艺(map);
mocky.verify();
assertEquals(expectedRet、map);
}
}

您应该设置
m.process(map)
将调用模拟过滤器上的
filter(map)

    Filter mockFilter = mockery.createMock("filter", Filter.class);

    // set expectation
    mockFilter.filter(map);
    replay(mockFilter);

    MyClass m = new MyClass(mockFilter);
    m.process(map);

    // verify expectation
    verify(mockFilter);
您在上面的代码摘录中采用的路径是尝试验证模拟过滤器。这不应该是你考试的目的。在您的案例中,测试的类是
MyClass
,而不是
Filter

更新:您可以向模拟添加行为:

expect(mockFilter.filter(map)).andDelegateTo(new Filter {
    @Override
    void filter(Map<String, String> map) {
        map.remove("remove");
    }
});

我不确定我是否明白你的意思,1-mockFilter没有一个名为process(Map)的方法,然后2-你在哪里设置映射需要从条目中条带化的期望。你能澄清一下吗?@Charbel:(1)我的错误。在设置期望值时,我编写了
process(map)
而不是
filter(map)
。模拟的
Filter
对象将具有
Filter
方法。(2) 就是这样。您不需要设置过滤器最终将删除条目的期望值。这是另一个测试的关注点,测试中的类是
Filter
。在这个测试中,我们正在测试
MyClass
。理想情况下,测试应该一次只关注一件事情。基本上,我想测试过滤器返回的映射是否正确。MyClass.process不会更改它。@Charbel:在EasyMock文档中查找
并将其委派到
。您可以将行为添加到模拟中,以对传入的映射进行操作。
class TestFilter implements Filter {
    @Override
    void filter(Map<String, String> map) {
        map.remove("remove");
    }
}

MyClass m = new MyClass(new TestFilter());
m.process(map);
assertNull(map.get("remove"));