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

Этот метод также полезен в условных выражениях, в которых вы можете аннулировать первое условие, но передавать второй или наоборот.