Mockito + Spy: Как собрать возвращаемые значения - PullRequest
11 голосов
/ 17 августа 2011

Я получил класс, использующий фабрику для создания какого-либо объекта.В моем модульном тесте я хотел бы получить доступ к возвращаемому заводскому значению.Поскольку фабрика напрямую передается классу, и для созданного объекта не предоставляется получатель, мне нужно перехватить возврат объекта с фабрики.

RealFactory factory     = new RealFactory();
RealFactory spy         = spy(factory);
TestedClass testedClass = new TestedClass(factory);

// At this point I would like to get a reference to the object created
// and returned by the factory.

Есть ли возможность получить доступ к возвращаемому значению фабрики?Вероятно, с помощью шпиона?
Единственный способ, который я вижу, - это смоделировать фабричный метод создания ...

С уважением

Ответы [ 2 ]

36 голосов
/ 06 сентября 2014

Во-первых, вы должны передать spy в качестве аргумента конструктора.

Кроме того, вот как вы можете это сделать.

public class ResultCaptor<T> implements Answer {
    private T result = null;
    public T getResult() {
        return result;
    }

    @Override
    public T answer(InvocationOnMock invocationOnMock) throws Throwable {
        result = (T) invocationOnMock.callRealMethod();
        return result;
    }
}

Использование по назначению:

RealFactory factory     = new RealFactory();
RealFactory spy         = spy(factory);
TestedClass testedClass = new TestedClass(spy);

// At this point I would like to get a reference to the object created
// and returned by the factory.


// let's capture the return values from spy.create()
ResultCaptor<RealThing> resultCaptor = new ResultCaptor<>();
doAnswer(resultCaptor).when(spy).create();

// do something that will trigger a call to the factory
testedClass.doSomething();

// validate the return object
assertThat(resultCaptor.getResult())
        .isNotNull()
        .isInstanceOf(RealThing.class);
1 голос
/ 17 августа 2011

Стандартным подходом к издевательству было бы:

  1. Предварительно создать объект, который вы хотите вернуть фабрике в тестовом примере
  2. Создать макет (или шпион) изfactory
  3. Предписать фиктивную фабрику для возврата предварительно созданного объекта.

Если вы действительно хотите, чтобы RealFactory создавал объект на лету, вы можете создать его подкласс и переопределитьфабричный метод для вызова super.create(...), затем сохраните ссылку в поле, доступном для тестового класса, а затем верните созданный объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...