Подтвердить что ты не робот

Mockito: как заглушить геттер

Я как бы новичок в Mockito, и мне было интересно, как я могу заглушить пару get/set.

Например

public interface Dummy {
     public String getString();
     public void setString(String string);
}

Как я могу заставить их вести себя правильно: если где-то в тесте я вызываю setString("something");, я хотел бы, чтобы getString() возвращал "что-то". Это возможно или есть лучший способ справиться с такими случаями?

4b9b3361

Ответ 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)