EasyMock ожидает, что метод вернет несколько разных объектов в одном тесте

Я использую EasyMock для модульного тестирования моего кода Java. Класс, который я пытаюсь протестировать, - это RESTful webservice API layer. API имеет базовый уровень сервиса, который высмеивается в тесте API. Моя проблема заключается в том, как правильно проверить модуль my editObject(ID, params...) метод API, так как он называет service.getById() дважды и ожидает, что при каждом вызове будет возвращен другой объект.

editObject(ID, params...) сначала пытается захватить объект из уровня сервиса, чтобы убедиться, что идентификатор действителен (first service.getById(ID) call to expect, возвращает исходный немодифицированный объект). Затем он изменяет параметры, указанные в вызове API, сохраняет его в службе и снова вызывает get, чтобы передать вызывающему объекту измененный объект, управляемый службой (second service.getbyId(ID) призыв ожидать, возвращает измененный объект).

есть ли способ представить это с помощью EasyMock?.

3 ответов


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

expect(mockService.getById(7)).andReturn(originalObject).once();
expect(mockService.getById(7)).andReturn(modifiedObject).once();
replay(mockService);

на .once() является необязательным, но в этом случае я нахожу, что он более самодокументирован.


вы можете связать несколько andReturn вызовы метода:

EasyMock.expect(service.getById(1))
    .andReturn(firstObject)
    .andReturn(secondObject);

в первый раз service.getById С 1 в качестве аргумента макет вернется firstObject и второй раз secondObject. Вы можете связать столько, сколько хотите, и даже бросить исключение через andThrow для конкретного вызова.


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