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 ответов
стандартный насмешливый подход будет:
- предварительно создайте объект, который фабрика должна вернуть в тестовом случае
- создать макет (или шпион) завода
- предписать макет фабрики, чтобы вернуть предварительно созданный объект.
Если вы действительно хотите иметь 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);