Mockito:如何存根 getter setter

2022-09-01 15:25:22

我对Mockito有点陌生,我想知道如何才能存根一个get/set对。

例如

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

我如何使它们行为正常:如果在测试中的某个地方我调用,我想返回“某物”。这是可行的,还是有更好的方法来处理这种情况?setString("something");getString()


答案 1

我还希望 getter 返回最近 setter-call 的结果。

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;
    }
}

我使用以下方法将 setter 连接到 getter:

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

我可以想到三种可能的方法。

  1. 不要直接在应用程序中使用;为它创建一个包装类,并为包装类创建一个接口。无论当前在应用程序中使用什么,请改用该接口。然后在测试中,有一个此接口的替代实现。然后,你根本不需要Mockito模拟。HttpServletRequestHttpServletRequest

  2. 测试类中有一个字段,用于存储已将值设置为的值。制作两个Mockito对象;一个在调用时返回此字段的值,另一个在调用时设置此字段的值。以通常的方式制作一个模拟,并将其存根以使用这两个答案。StringAnswergetStringsetString

  3. 创建一个抽象类(可以是测试类的静态内部类),该类实现接口,但具有要设置的字段,并定义 getter 和 setter。然后模拟抽象类,并将Mockito.CALLS_REAL_METHODS作为默认答案传入。当你在模拟上调用 getter 或 setter 时,真正的方法就会启动,这就是你想要的行为。HttpServletRequest

希望这三种替代方案中的一种能够满足您的需求。