繁体   English   中英

Mockito:如何存根 getter setter

[英]Mockito: how to stub getter setter

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

例如

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

我怎样才能让它们正常运行:如果在测试中的某个地方我调用了setString("something"); 我希望getString()返回“某物”。 这是可行的还是有更好的方法来处理这种情况?

我还希望 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;
    }
}

我使用以下方法将 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));

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

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

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

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

希望这三种选择中的一种能够满足您的需求。

我发现这很好用:

doAnswer(answer -> when(dummy.getString()).thenReturn((String) answer.getArguments()[0]))
    .when(dummy).setString(any());

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

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

在 HttpServletRequest 存根的这种特殊情况下,我强烈建议使用 Spring-Mock 框架:( http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/mock/web/package-摘要.html )

它具有用于基于 Web 的操作的内置模拟。

否则,请使用 Answer 为您的模拟对象定义您自己的响应 ( http://mockito.googlecode.com/svn/branches/1.8.5/javadoc/org/mockito/stubbing/Answer.html )

我有这个问题,但不想接受已接受的答案,因为这样做会停止嘲笑我的 bean 中的所有getter 和 setter。 我想要的只是为单个 getter/setter 对创建存根,而不是全部。 因此,我使用了以下代码。

@Mock
private Dummy mockDummy;
private final MutableObject<String> stringWrapper = new MutableObject<>();

public TestClass() {
    MockitoAnnotations.initMocks(this);

    doAnswer(invocationOnMock -> {
        String injectedString = (String)invocationOnMock.getArguments()[0];
        TestClass.this.stringWrapper.setValue(injectedString);
        return null;
    }).when(this.mockDummy).setString(any());
    when(this.mockDummy.getString()).thenAnswer(
            invocationOnMock -> TestClass.this.stringValue.getValue());
}

第一个 lambda 实现了Answer<Void>匿名类的answer()方法 因此,每当被测代码执行 setter 方法时,该 setter 的存根会将其记录到MutableObject帮助程序对象中。 设置的这个记录值然后可以由 getter 实现返回。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM