Исключение из «приятного издевательства» EasyMock с отладчиком - PullRequest
4 голосов
/ 30 мая 2011

(Отказ от ответственности - EasyMock newb)

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

Однако следующий фрагмент кода для меня завершается ошибкой с IllegalStateException("missing behavior definition for the preceding method") на втором foo.translate() line.

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)).

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

Ответы [ 3 ]

3 голосов
/ 06 июня 2011

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

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

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

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

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

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

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

1 голос
/ 30 мая 2011

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

expect(foo.translate("a","b")).andStubReturn(retVal);
0 голосов
/ 07 июня 2011

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

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

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

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