Как я могу смоделировать метод в easymock, который должен вернуть один из его параметров? - PullRequest
30 голосов
/ 19 апреля 2010

public Object doSomething(Object o);, который я хочу издеваться. Он должен просто вернуть свой параметр. Я попробовал:

Capture<Object> copyCaptcher = new Capture<Object>();
expect(mock.doSomething(capture(copyCaptcher)))
        .andReturn(copyCatcher.getValue());

но без успеха я получаю просто AssertionError как java.lang.AssertionError: Nothing captured yet. Есть идеи?

Ответы [ 5 ]

26 голосов
/ 17 октября 2011

Что ж, проще всего было бы просто использовать Capture в реализации IAnswer ... когда вы выполняете это inline, вы должны объявить его final, конечно.

MyService mock = createMock(MyService.class);

final Capture<ParamAndReturnType> myCapture = new Capture<ParamAndReturnType>();
expect(mock.someMethod(capture(myCapture))).andAnswer(
    new IAnswer<ParamAndReturnType>() {
        @Override
        public ParamAndReturnType answer() throws Throwable {
            return myCapture.getValue();
        }
    }
);
replay(mock)

Это, пожалуй, самый точный способ, не зависящий от некоторой контекстной информации. Это делает трюк для меня каждый раз.

18 голосов
/ 22 июня 2010

Я искал то же самое поведение и наконец написал следующее:

import org.easymock.EasyMock;
import org.easymock.IAnswer;

/**
 * Enable a Captured argument to be answered to an Expectation.
 * For example, the Factory interface defines the following
 * <pre>
 *  CharSequence encode(final CharSequence data);
 * 
* Для целей тестирования нам не нужно реализовывать этот метод, поэтому он должен быть посмеянным. *
 * final Factory factory = mocks.createMock("factory", Factory.class);
 * final ArgumentAnswer<CharSequence> parrot = new ArgumentAnswer<CharSequence>();
 * EasyMock.expect(factory.encode(EasyMock.capture(new Capture<CharSequence>()))).andAnswer(parrot).anyTimes();
 * 
* Создано 22 июня 2010 года. * @author Реми Фуйу * * / открытый класс ArgumentAnswer реализует IAnswer { private final int argumentsOffset; public ArgumentAnswer () { это (0); } public ArgumentAnswer (int offset) { this.argumentOffset = offset; } / ** * {@inheritDoc} * / @SuppressWarnings ( "флажок") public T answer () выбрасывает Throwable { final Object [] args = EasyMock.getCurrentArguments (); if (args.length

Я написал быстрое «как» в javadoc класса.

Надеюсь, это поможет.

15 голосов
/ 18 января 2012

Захваты предназначены для проверки значений, передаваемых макету впоследствии. Если вам нужен только макет для возврата параметра (или некоторого значения, рассчитанного по параметру), вам просто нужно реализовать IAnswer.

См. Реализацию "Remi Fouilloux", если вы хотите многократно использовать способ передачи параметра X назад, но игнорируйте его использование Capture в примере.

Если вы просто хотите вставить это, как в примере с "do_the_trick", опять же, Capture - это красная сельдь. Вот упрощенная версия:

MyService mock = createMock(MyService.class);
expect(mock.someMethod(anyObject(), anyObject()).andAnswer(
    new IAnswer<ReturnType>() {
        @Override
        public ReturnType answer() throws Throwable {
            // you could do work here to return something different if you needed.
            return (ReturnType) EasyMock.getCurrentArguments()[0]; 
        }
    }
);
replay(mock)
9 голосов
/ 17 января 2015

Основываясь на @does_the_trick и используя лямбды, вы можете написать следующее:

MyService mock = EasyMock.createMock(MyService.class);

final Capture<ParamAndReturnType> myCapture = EasyMock.newCapture();
expect(mock.someMethod(capture(myCapture))).andAnswer(() -> myCapture.getValue());

или без захвата, как предложил @thetoolman

expect(mock.someMethod(capture(myCapture)))
.andAnswer(() -> (ParamAndReturnType)EasyMock.getCurrentArguments()[0]);
2 голосов
/ 19 апреля 2010

Хм, если я правильно понимаю ваш вопрос, я думаю, вы, возможно, слишком усложняете его.

Object someObject = .... ;<br> expect(mock.doSomething(someObject)).andReturn(someObject);

Должно работать нормально. Помните, что вы предоставляете как ожидаемый параметр, так и возвращаемое значение. Таким образом, использование одного и того же объекта в обеих работах.

...