可能是我误解了模拟对象的概念。我在stackoverflow中看到了一些帖子,以便了解何时应该使用模拟对象。真的我不知道什么时候必须使用模拟对象。我举了一本书Growing Object-Oriented Software, Guided by Tests的例子:
context.checking(new Expectations() {{
oneOf (turtle).turn(45);
}});
用法很简单:
turn
方法只执行一次吗?如果是真的测试将通过。如果没有测试将失败。这是我对模拟对象的理解。
模拟使用行为验证,我们检查SUT是否在协作者上进行了正确的调用。
但我的问题是,如果我们想要对SUT进行单元测试,我们需要验证协作者对象的行为(在本例中为turtle
)?
答案 0 :(得分:1)
正如所建议的那样,Martin Fowler撰写了一篇非常有趣的文章http://goo.gl/85qY,您可以通过示例真实地看到模拟和存根的概念。
首先澄清一下你是否需要模拟或存根。
模拟是关于行为或方法。
模拟是我们在这里所讨论的:预先编程了预期的对象,形成了预期会收到的调用的规范。
当您进行单元测试时,您应该模拟该类的协作者,因为它们没有经过测试。例如,您用来持久化数据源的对象,因为在单元测试期间您不想持久保存任何内容,请与系统的其他部分隔离进行测试。
<强>存根强>
Stubs为测试期间的调用提供了固定的答案,通常根本不会对测试中编程的任何内容做出任何响应。存根还可以记录有关呼叫的信息,例如记住它发送的消息的电子邮件网关存根,或者可能只记录它发送的消息的数量。
看一下Mockito实例http://goo.gl/zujvY,以便了解模拟框架可以做什么,但在澄清之前是否要测试行为或对象的状态。