Как имитировать вызов метода в конструкторе с помощью easymock?

#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 сделаете его доступным для фактического метода тестирования.