【问题标题】:How to stub get/set of simple types如何存根获取/设置简单类型
【发布时间】:2012-05-09 08:27:15
【问题描述】:

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

例如

public interface Order {
     public short getStatus();
     public void setStatus(short status);
}

我怎样才能让它们正常运行:

如果在某个测试中调用setStatus(4);,我希望getStatus() 返回4。如何做到这一点?

【问题讨论】:

    标签: java mockito setter getter stub


    【解决方案1】:

    你是stubbing or mocking吗?

    区别在于您是在验证行为还是为测试提供数据。你说:

    如果在某个测试中我调用 setStatus(4);我希望 getStatus() 返回 4。

    这意味着两者同时存在。您要么想要验证 setStatus() 是使用参数 4 调用的。

    verify(mockObject).setStatus(4);
    

    或者您想将模拟对象设置为在调用 getStatus() 时返回 4。

    when(mockObject.getStatus()).thenReturn(4);
    

    Mockito 有some tutorials,它解释了如何在每种情况下使用它。我怀疑你可以在你的测试中做这两个(但没有检查),但这对我来说是一种气味,因为理想情况下你应该只在测试中检查一个单一的东西,其他所有东西都应该被存根。但是,与以往一样,上下文就是一切,因此您可能需要存根对象的一部分,以便验证另一部分的行为,在这种情况下就可以了。

    按照AAA syntax 并安排您的测试(即进行设置并使用when 子句)然后采取行动(即在被测对象上调用方法)然后进行断言(即拥有您的verify 语句)

    编辑

    似乎在 mockito 的较新版本(1.8+)中可以做你想做的事,尽管不推荐。您可以使用 Spy 创建对象的部分模拟。在这种情况下,您应该能够为您的实际对象创建一个 Spy,保留 getStatus()setStatus() 方法未存根(因此它们实际上被调用和使用)并且只是存根其他方法(或只是验证它们大概被称为)。您可以在13 Spying on real objects on this page 部分阅读。

    【讨论】:

    • 我想让我的模拟对象具有真正的获取/设置功能。
    • @TheSchwartz 然后 mockito 不是这样做的方法。然后,您需要编写自己的模拟对象,或者使用提供您想要的功能的不同框架。
    • 你说的很对,我发现使用 verify(mockObject, times(1)).setStatus(4);解决了我的目的。谢谢。
    • 另一种方法是使用参数捕获:Capturing of arguments,但在我的情况下这似乎有点矫枉过正 - 谢谢。
    • @TheSchwartz 不要忘记将答案标记为已接受(使用答案左侧投票按钮下的勾号),如果它解决了您的问题(只要有人会指出它,如果您最终不要接受答案)
    【解决方案2】:

    您可以设置 setStatus 方法的行为,使其更新 getStatus 方法的行为,如下所示:

        Mockito.doAnswer(invocation -> {
            short status = invocation.getArgumentAt(0, Short.class);
            Mockito.when(mockOrder.getStatus()).thenReturn(status);
            return null;
        }).when(mockOrder).setStatus(Mockito.anyShort());
    

    【讨论】:

      猜你喜欢
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 2022-06-19
      • 1970-01-01
      • 2015-05-21
      • 2019-08-25
      • 2014-04-27
      • 2013-06-14
      相关资源
      最近更新 更多