我是 Mockito 的新手,我想知道如何存根获取/设置对。
例如
public interface Order {
public short getStatus();
public void setStatus(short status);
}
我怎样才能让他们行为正常:
如果在某个测试中我调用setStatus(4);
我想getStatus()
返回4
. 如何才能做到这一点?
你是在嘲讽还是嘲讽?
区别在于您是在验证行为还是为测试提供数据。你说:
如果在某个测试中我调用 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 节“监视真实对象”中了解它。
您可以设置 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());