Mockito:如何使用getter setter

Gui*_*let 22 java testing mockito

我是Mockito的新手,我想知道如何存根获取/设置对.

例如

public interface Dummy {
     public String getString();
     public void setString(String string);
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能使它们正常运行:如果我在调用的某个地方调用,setString("something");我想getString()返回"某些东西".这是可行的还是有更好的方法来处理这种情况?

use*_*754 34

我还想让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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用以下方法将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));
Run Code Online (Sandbox Code Playgroud)


Daw*_*ica 7

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

  1. 不要HttpServletRequest直接在您的应用程序中使用; 为它创建一个包装类,并为包装类提供一个接口.无论您当前HttpServletRequest在应用程序中使用何处,请使用界面.然后在测试中,有一个该接口的替代实现.然后,你根本不需要Mockito模拟.

  2. 在测试类中有一个字段,用于存储您设置的值String.制作两个Mockito Answer对象; 一个在getString调用时返回该字段的值,另一个在调用时设置该字段的值setString.以通常的方式进行模拟,并将其存根以使用这两种答案.

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

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


tho*_*dge 5

我发现这效果很好:

doAnswer(answer -> when(dummy.getString()).thenReturn((String) answer.getArguments()[0]))
    .when(dummy).setString(any());
Run Code Online (Sandbox Code Playgroud)

我必须使用 doAnswer(..).when(..) 因为 setter 是一个 void 方法。当使用对象调用 setter 时,getter 将被设置为使用同一对象进行响应。

当您有接口但没有实现时非常有用。