Метод EasyMock void
Я пытаюсь использовать EasyMock для издевательства над каким-то интерфейсом базы данных, поэтому я могу проверить бизнес-логику с помощью метода упаковки. Я обожаю методы, которые возвращаются с помощью следующего в моей настройке моего теста.
DBMapper dbmapper = EasyMock.createMock(DBMapper.class);
userService.setDBMapper(dbmapper);
то в рамках моего фактического теста я запускаю
EasyMock.expect(dbmapper.getUser(userId1)).andReturn(mockUser1);
EasyMock.replay(dbmapper);
userService.getUser(userId1);
Затем эта услуга подключается к dbmapper и возвращает объект (преобразователь вводится с использованием методов setter)
Кажется, что эти мазки работают нормально. Однако, когда я пытаюсь запустить тест для
userService.addUser(newUser1);
Этот метод вызывает метод void.
dbmapper.createUser(newUser);
Этот метод, что у меня проблемы с издевательством.
Я пробовал следующие
EasyMock.expectLastCall();
EasyMock.replay(dbMapper);
userService.addUser(newUser1);
поскольку некоторые другие сообщения/вопросы и т.д., кажется, предлагают мне получить IlligalStateException: no last call on a mock available
Может ли кто-нибудь указать мне в правильном направлении, пожалуйста?
Большое спасибо заранее
Ответы
Ответ 1
Вы близко.
Вам просто нужно вызвать метод на ваш макет перед вызовом expectLastCall()
Итак, вы ожидали бы выглядеть так:
userService.addUser(newUser1);
EasyMock.expectLastCall();
EasyMock.replay(dbMapper);
userService.addUser(newUser1);
Это работает, потому что макет объекта находится в режиме записи перед вызовом replay()
, поэтому любые вызовы на него будут выполнять поведение по умолчанию (возвращать null/ничего не делать) и будут иметь право на повторное воспроизведение, если метод replay()
называется.
Что мне нравится делать, чтобы убедиться, что очевидно, что вызов метода для ожидания состоит в том, чтобы поставить небольшой комментарий перед ним следующим образом:
/* expect */ userService.addUser(newUser1);
EasyMock.expectLastCall();
EasyMock.replay(dbMapper);
userService.addUser(newUser1);
Ответ 2
Эта проблема не возникает, если вы используете "хороший" API:
DBMapper dbmapper = EasyMock.createNiceMock(DBMapper.class);
Есть два вида макетов - строгий и приятный. Строгий макет вызывает ошибку утверждения в случае вызова неожиданного метода. Хороший макет позволяет неожиданным вызовам метода на макет.
Для получения дополнительной информации см. официальный документ - http://easymock.org/user-guide.html#mocking-strict