4

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

例如

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

我怎样才能让他们行为正常:

如果在某个测试中我调用setStatus(4);我想getStatus()返回4. 如何才能做到这一点?

4

2 回答 2

5

你是在嘲讽还是嘲讽

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

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

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

verify(mockObject).setStatus(4);

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

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

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

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

编辑

似乎在 mockito 的较新版本(1.8+)中,它可能可以做你想做的事,尽管不推荐。您可以使用 Spy 创建对象的部分模拟。在这种情况下,您应该能够为您的实际对象创建一个 Spy,让getStatus()andsetStatus()方法不被存根(因此它们实际上被调用和使用)并且只是存根其他方法(或者只是验证它们可能被调用)。您可以在此页面上的第 13 节“监视真实对象”中了解它。

于 2012-05-09T08:31:51.167 回答
3

您可以设置 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());
于 2015-03-14T00:20:13.627 回答