我是 Mockito 的新手,我想知道如何存根一个获取/设置对。
例如
public interface Order {
public short getStatus();
public void setStatus(short status);
}
如何使它们正常运行:
如果我在测试中的某个地方调用setStatus(4);
我想getStatus()
返回4
.如何做到这一点?
你是在嘲笑还是在嘲笑?
区别在于您是在验证行为还是为测试提供数据。 你说:
如果在测试中的某个地方我调用 setStatus(4(;我希望 getStatus(( 返回 4。
这意味着两者同时存在。 您要么想要验证是否使用参数 4 调用了setStatus()
。
verify(mockObject).setStatus(4);
或者,您希望将模拟对象设置为在调用 getStatus()
时返回 4。
when(mockObject.getStatus()).thenReturn(4);
Mockito有一些教程,解释了如何在每种情况下使用它。 我怀疑你可以在测试中同时做这两件事(但没有检查过(,但这对我来说是一种气味,因为理想情况下你应该只检查在你的测试中嘲笑一件事,其他一切都应该存根。 但是,与以往一样,上下文就是一切,因此您可能需要存根对象的一部分,以便您可以验证另一部分的行为,在这种情况下会很好。
遵循 AAA 语法并安排您的测试(即进行设置并具有 when
子句(然后采取行动(即在被测试对象上调用该方法(,然后执行您的断言(即具有您的verify
语句(
编辑
似乎在 mockito 的较新版本 (1.8+( 中,可以做您想做的事,尽管不建议这样做。 您可以使用间谍创建对象的部分模拟。 在这种情况下,您应该能够创建实际对象的间谍,将getStatus()
和setStatus()
方法保留为非存根(因此它们实际上被调用和使用(,并且只是存根其他方法(或只是验证它们可能被调用(。 您可以在此页面上的第 13 节监视真实对象中阅读有关它的信息。
您可以设置 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());