EasyMock ожидает, что метод возвращает несколько разных объектов в одном тесте
Я использую EasyMock для unit test моего кода Java. Класс, который я пытаюсь протестировать, представляет собой слой API веб-сервиса RESTful. API имеет базовый уровень сервиса, который издевается над тестом API. Моя проблема заключается в том, как правильно использовать метод unit test my editObject(ID, params...)
API, так как он дважды вызывает service.getById()
и ожидает, что с каждым вызовом будет возвращен другой объект.
editObject(ID, params...)
сначала пытается захватить объект с уровня сервиса, чтобы убедиться, что идентификатор действителен (первый service.getById(ID)
вызов ожидать, возвращает исходный немодифицированный объект). Затем он изменяет параметры, указанные в вызове API, сохраняет его в службе, и вызовы снова получают доступ к вызывающему объекту, управляемому сервисом, (второй вызов service.getById(ID)
для ожидания, возвращает измененный объект).
Есть ли способ представить это с помощью EasyMock?.
Ответы
Ответ 1
Конечно, вы можете сделать две разные вещи для двух вызовов методов с помощью одного и того же метода и параметров. Просто объявляйте свои ожидания в том порядке, в котором вы ожидаете, что они произойдут, и соответственно настройте ответы.
expect(mockService.getById(7)).andReturn(originalObject).once();
expect(mockService.getById(7)).andReturn(modifiedObject).once();
replay(mockService);
.once()
является необязательным, но в этом случае я считаю, что он более самодокументирован.
Ответ 2
Вы можете связать несколько вызовов методов andReturn
:
EasyMock.expect(service.getById(1))
.andReturn(firstObject)
.andReturn(secondObject);
При первом вызове service.getById
с аргументом 1
mock возвращает firstObject
и второй раз secondObject
. Вы можете объединить столько, сколько хотите, и даже выбросить исключение через andThrow
для определенного вызова.
Ответ 3
Этот метод также полезен в условных выражениях, в которых вы можете аннулировать первое условие, но передавать второй или наоборот.