Mockito: как заглушить геттер
Я как бы новичок в Mockito, и мне было интересно, как я могу заглушить пару get/set.
Например
public interface Dummy {
public String getString();
public void setString(String string);
}
Как я могу заставить их вести себя правильно: если где-то в тесте я вызываю setString("something");
, я хотел бы, чтобы getString()
возвращал "что-то". Это возможно или есть лучший способ справиться с такими случаями?
Ответы
Ответ 1
Я также хотел, чтобы getter возвращал результат недавнего вызова setter.
Имея
class Dog
{
private Sound sound;
public Sound getSound() {
return sound;
}
public void setSound(Sound sound) {
this.sound = sound;
}
}
class Sound
{
private String syllable;
Sound(String syllable) {
this.syllable = syllable;
}
}
Я использовал следующее для подключения установщика к получателю:
final Dog mockedDog = Mockito.mock(Dog.class, Mockito.RETURNS_DEEP_STUBS);
// connect getter and setter
Mockito.when(mockedDog.getSound()).thenCallRealMethod();
Mockito.doCallRealMethod().when(mockedDog).setSound(Mockito.any(Sound.class));
Ответ 2
Я могу представить три возможных подхода.
-
Не используйте HttpServletRequest
непосредственно в приложении; сделать для него класс-оболочку и иметь интерфейс для класса-оболочки. Где бы вы не использовали HttpServletRequest
в приложении, используйте вместо этого интерфейс. Затем в тесте выполните альтернативную реализацию этого интерфейса. Тогда вам не нужен фальшивый Mockito.
-
Введите поле в тестовом классе, в котором хранится значение, которое вы установили для параметра String
. Сделайте два объекта Mockito Answer
; тот, который возвращает значение этого поля при вызове getString
, а другой, который устанавливает значение этого поля при вызове setString
. Сделайте издевательство обычным способом и заглушите его, чтобы использовать оба этих ответа.
-
Создайте абстрактный класс (который может быть статическим внутренним классом вашего тестового класса), который реализует интерфейс HttpServletRequest
, но имеет поле, которое вы хотите установить, и определяет геттер и сеттер. Затем издевайтесь над абстрактным классом и передайте Mockito.CALLS_REAL_METHODS в качестве ответа по умолчанию. Когда вы вызываете геттер или сеттер на макет, реальный метод будет срабатывать, а это поведение, которое вы хотите.
Надеемся, что один из этих трех вариантов удовлетворит ваши потребности.
Ответ 3
В этом конкретном случае для HttpServletRequest stubbing я настоятельно рекомендую использовать Spring -Mock framework:
(http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/mock/web/package-summary.html)
Он имеет встроенные макеты для веб-операций.
В противном случае используйте ответ, чтобы определить свой собственный ответ для ваших издевающихся объектов (http://mockito.googlecode.com/svn/branches/1.8.5/javadoc/org/mockito/stubbing/Answer.html)