【问题标题】:EasyMock, andReturn a captureEasyMock,并返回一个捕获
【发布时间】:2010-08-16 20:56:14
【问题描述】:

假设我想模拟一个具有以下签名的方法:

public A foo(A a)

我希望 foo 以返回接收到的内容的方式被模拟(即同一个实例 a)

我尝试了以下失败:

Capture<A> capture = new Capture();
expect(myclass.foo(capture)).andReturn(capture.getValue());

这不起作用,因为调用 getValue() 时捕获仍然是空的。

有什么想法吗?

谢谢

【问题讨论】:

    标签: easymock


    【解决方案1】:
    public class A {
    
        public <A> A foo(A a) {
            return null;
        }
    
        public static void main(String[] args) throws Exception {
            A mock = createNiceMock(A.class);
    
            expect(mock.foo(anyObject())).andAnswer(new IAnswer<Object>() {
                @Override
                public Object answer() throws Throwable {
                    return EasyMock.getCurrentArguments()[0];
                }
            }).anyTimes();
    
            replay(mock);
    
            System.out.println(mock.foo("1"));
            System.out.println(mock.foo(2L));
        }
    }
    

    打印出来:

    1
    2
    

    【讨论】:

    • 看起来有点太复杂了。没有更简单的方法吗?
    • 你可以提取答案到你自己的班级。
    • 提取到单独类的示例:stackoverflow.com/questions/2667172/… 定义一次,然后在任何你想使用它的地方你只要说expect(...).andAnswer(new ArgumentAnswer())
    • 您还可以在 IAnswer 中使用您的捕获,在两个地方保存一些潜在的转换和编辑参数位置。在这种情况下,还应该可以创建一个适用于所有情况的通用 AnswerWithCapture,并将 Capture 实例作为构造函数参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    相关资源
    最近更新 更多