Mockito + Spy: как собрать возвращаемые значения

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

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.

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

в отношении

2 ответов


стандартный насмешливый подход будет:

  1. предварительно создайте объект, который фабрика должна вернуть в тестовом случае
  2. создать макет (или шпион) завода
  3. предписать макет фабрики, чтобы вернуть предварительно созданный объект.

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


Первое, что вы должны пройти 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);