Java EasyMock:获取 EasyMock.anyObject() 的真实参数值?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/21005775/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 05:52:41  来源:igfitidea点击:

EasyMock: Get real parameter value for EasyMock.anyObject()?

javaunit-testingeasymock

提问by Armen

In my unit tests I'm using EasyMock for creating mock objects. In my test code I have something like this

在我的单元测试中,我使用 EasyMock 来创建模拟对象。在我的测试代码中,我有这样的事情

EasyMock.expect(mockObject.someMethod(anyObject())).andReturn(1.5);

So, now EasyMock will accept any call to someMethod(). Is there any way to get real value that is passed to mockObject.someMethod(), or I need to write EasyMock.expect()statement for all possible cases?

所以,现在 EasyMock 将接受任何对someMethod(). 有没有办法获得传递给 的真实值mockObject.someMethod(),或者我需要EasyMock.expect()为所有可能的情况编写语句?

采纳答案by hoaz

You can use Captureclass to expect and capture parameter value:

您可以使用Capture类来期望和捕获参数值:

Capture capturedArgument = new Capture();
EasyMock.expect(mockObject.someMethod(EasyMock.capture(capturedArgument)).andReturn(1.5);

Assert.assertEquals(expectedValue, capturedArgument.getValue());

Note that Captureis generic type and you can parametrize it with an argument class:

请注意,这Capture是泛型类型,您可以使用参数类对其进行参数化:

Capture<Integer> integerArgument = new Capture<Integer>();

Update:

更新:

If you want to return different values for different arguments in your expectdefinition, you can use andAnswermethod:

如果要为expect定义中的不同参数返回不同的值,可以使用andAnswer方法:

EasyMock.expect(mockObject.someMethod(EasyMock.capture(integerArgument)).andAnswer(
    new IAnswer<Integer>() {
        @Override
        public Integer answer() {
            return integerArgument.getValue(); // captured value if available at this point
        }
    }
);

As pointed in comments, another option is to use getCurrentArguments()call inside answer:

正如评论中所指出的,另一种选择是使用getCurrentArguments()call inside answer

EasyMock.expect(mockObject.someMethod(anyObject()).andAnswer(
    new IAnswer<Integer>() {
        @Override
        public Integer answer() {
            return (Integer) EasyMock.getCurrentArguments()[0];
        }
    }
);