#java #constructor #easymock
#java #конструктор #easymock
Вопрос:
У меня есть класс, который получает factory в качестве аргумента, вызываемого внутри конструктора. Он должен быть вызван там, потому что объект должен быть полностью инициализирован, прежде чем его можно будет использовать. Что-то вроде:
class MyClass {
private Foo foo;
MyClass(FooFactory fooFactory, Bar bar) {
this.foo = fooFactory.newFoo(bar);
}
}
Экземпляр Foo не может быть напрямую передан конструктору, поэтому считайте, что это ограничение проблемы. MyClass нельзя протестировать с помощью EasyMock, потому что FooFactory был бы макетом, который не был инициализирован в настройке:
private MyClass myClass;
public void setUp() {
FooFactory fooFactory = mock(fooFactory);
Bar bar = new Bar();
myClass = new MyClass(fooFactory, bar)
}
Таким образом, при вызове setUp вызов fooFactory.newFoo(bar)
внутри конструктора завершится ошибкой с исключением IllegalStateException, поскольку такие ожидания не были установлены.
Вопрос в том, как вы можете имитировать вызовы методов в конструкторе?
Комментарии:
1. Почему вы не можете установить ожидания FooFactory в методе setUp()?
2. Поскольку конструктор вызовет FooFactory.newFoo(bar) перед вызовом replay(), будет выдано исключение. Если вы вызываете replay() в программе установки, вы не сможете имитировать что-либо еще в других тестах.
Ответ №1:
Вы можете EasyMock.reset(fooFactory)
войти setUp
после MyClass
создания.
Комментарии:
1. Возможно, я не понял, что вы имеете в виду, но это не сработало бы. Проблема здесь не в том, чтобы сбросить макет, а в том, чтобы заставить его работать перед вызовом replay().
2. Я думаю, он имеет в виду, что вы можете воспроизвести макет, вызвать свой конструктор, а затем сбросить свой макет, чтобы использовать его так, как если бы вы не вызывали replay. Документация по сбросу не очень понятна.
3. @peninha у меня это работает.
reset
возвращает фиктивное состояние к тому же, что и после его создания. Вы запишете поведение дляfooFactory.newFoo()
,replay
него, вызывающегоMyClass
конструктор,verify
иreset
сделаете его доступным для фактического метода тестирования.