EasyMock: получить реальное значение параметра для EasyMock.anyObject()?

В моих модульных тестах я использую EasyMock для создания макетных объектов. В моем тестовом коде у меня есть что-то вроде этого

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

Итак, теперь EasyMock примет любой вызов someMethod(). Есть ли способ получить реальное значение, которое передается в mockObject.someMethod(), или мне нужно написать инструкцию EasyMock.expect() для всех возможных случаев?

Ответ 1

Вы можете использовать класс Capture для ожидания и захвата значения параметра:

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

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

Обратите внимание, что Capture является общим типом, и вы можете параметризовать его с помощью класса аргументов:

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

Update:

Если вы хотите возвращать разные значения для разных аргументов в определении 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
        }
    }
);

Как указано в комментариях, другой вариант заключается в использовании вызова getCurrentArguments() внутри answer:

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