2011-05-30 2 views
3

(Отказ от ответственности - EasyMock Newb)Получения исключения из «хорошего макета» EasyMock с помощью отладчика прилагается

Согласно документации (и this post), если бы я хотел использовать EasyMock для создания объектов-заглушек, я должен использовать EasyMock.createNiceMock(). «Хороший макет» на самом деле является заглушкой - то есть объектом, который не участвует в проверке, просто возвращает значения.

Однако следующий снипп не подходит для меня с IllegalStateException("missing behavior definition for the preceding method"), на второй линии foo.translate().

Foo foo = EasyMock.createNiceMock(Foo.class); 
EasyMock.replay(foo); // added this line 
foo.translate("a", "b"); 
foo.translate("a", "b"); // only the second calls throws an exception 

Может кто-нибудь объяснить это, или, вернее сказать мне, как использовать EasyMock для создания заглушек с нулевым многословие (O (number_of_exercised_mock_methods)).

Редактировать - Я заметил, что получаю эти ошибки почти всегда, когда отладчик подключен, но никогда, когда он не подключен. Любая идея, как это может быть связано?

ответ

1

Если ваш метод перевода возвращает значение, вам необходимо настроить его.

expect(foo.translate("a","b")).andStubReturn(retVal); 
+0

Разве это не Nice Мок должен позволить мне не установить ожидания? Это означает, что если выполняются k-методы, мне нужно установить k ожиданий ... и в этом случае меня вообще не интересуют ожидания, я просто хочу возражать против работы. – ripper234

+0

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

+0

«добавление возвращаемого значения ...» - это потребует установки ожиданий для всех методов, которые я пытаюсь избежать. Я не хочу вообще устанавливать ожидания. Я считаю, что вышеупомянутый вызов не срабатывает, даже если я вызываю replay() после первой строки (я попробую его в следующий раз, когда я на работе). – ripper234

3

В дополнение к ответам Джеффа.

От метода createNiceMock Javadoc EasyMock в:

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

Макет объекта, созданного этим методом, не нуждается в какой-либо конфигурации (ожидаемые вызовы). Вам просто нужно создать его и «воспроизвести». Пример:

ComplicatedObject stub = EasyMock.createNiceMock(); 
replay(stub); 

Любой вызов метода допускается на созданном заглушкой (она не будет сгенерировано исключение), и они всегда будут возвращать значение по умолчанию (0, NULL или ложь). Если вы настроите определенное ожидание вызова, вам придется настроить его возвращаемое значение или вы получите ошибку (это ваш случай).

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

0

Необходимо позвонить по телефону EasyMock.replay(foo). Прежде чем вы сделаете это, ваш mock-объект находится в «состоянии записи». Из EasyMock документации:

В состоянии звукозаписывающего (перед вызовом реплеев), Мок объект не ведут себя как фиктивный объект, но он записывает вызовы методов. После вызова replay он ведет себя как Mock Object, , проверяя, действительно ли выполняются вызовы .

Если вы с создания объекта заглушки просто вызвать createNiceMock с последующим replay:

Foo foo = EasyMock.createNiceMock(Foo.class); 
EasyMock.replay(foo); 
foo.translate("a", "b"); 
foo.translate("a", "b");