Получение исключения из красивого макета EasyMock с прикрепленным отладчиком

(Заявление об ограничении ответственности - EasyMock newb)

Согласно документации (и этот пост), если бы я хотел использовать 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)).

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


person ripper234    schedule 30.05.2011    source источник


Ответы (3)


Дополняя ответ Джеффа.

Из метода EasyMock createNiceMock javadoc:

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

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

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

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

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

person Andre Rodrigues    schedule 06.06.2011

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

expect(foo.translate("a","b")).andStubReturn(retVal);
person Jeff Storey    schedule 30.05.2011
comment
Разве хороший макет не должен позволять мне не оправдывать ожиданий? Это означает, что если используются k методов, мне нужно установить k ожиданий ... и в этом случае меня совсем не интересуют ожидания, я просто хочу возразить против работы. - person ripper234; 31.05.2011
comment
Я считаю, что это касается только проверки макета, а не настройки. Вы пытались добавить возвращаемое значение и посмотреть, работает ли оно? Кроме того, если вас не волнует ожидание, и вам просто нужен фиктивный объект, зачем вообще беспокоиться о настройке ожидания, просто создайте хороший макет и поместите его в режим воспроизведения. - person Jeff Storey; 31.05.2011
comment
добавление возвращаемого значения ... - для этого потребуется настройка ожидаемых значений для всех методов, которых я пытаюсь избежать. Я вообще не хочу создавать каких-либо ожиданий. Я считаю, что приведенный выше вызов не работает, даже если я вызываю replay () после первой строки (я попробую его в следующий раз, когда буду на работе). - person ripper234; 01.06.2011
comment
О, я что-то пропустил в вашем коде. На самом деле вы не создали красивый макет, вы создали стандартный макет с помощью EasyMock.createMock. Используйте EasyMock.createNiceMock, чтобы создать красивый макет. - person Jeff Storey; 01.06.2011
comment
@ Джефф, подожди, что? Я проверю это и вернусь к вам, я был уверен, что попробовал классную пародию. - person ripper234; 01.06.2011
comment
Просто проверил - проблема сохраняется даже с createNiceMock (соответственно отредактировал образец кода) - person ripper234; 02.06.2011
comment
Да, я подтвердил, что вам нужно добавить andStubReturn (или andReturn). Если вы хотите, чтобы метод возвращал значения по умолчанию (например, false, 0 и т. Д.), Просто не устанавливайте никаких ожиданий, например: Foo foo = createNiceMock (Foo.class); повтор (фу); В противном случае вам нужно добавить возвращаемое значение для методов, которые их возвращают. - person Jeff Storey; 03.06.2011

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

В состоянии записи (перед вызовом воспроизведения) фиктивный объект не ведет себя как фиктивный объект, но записывает вызовы методов. После вызова воспроизведения он ведет себя как фиктивный объект, проверяя, действительно ли выполнены ожидаемые вызовы метода.

Если вы хотите создать объект-заглушку, просто вызовите createNiceMock, а затем replay:

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