为什么我们应该通过mock知道有关邻居对象的信息?

时间:2014-08-26 16:33:38

标签: java unit-testing mocking jmock

可能是我误解了模拟对象的概念。我在stackoverflow中看到了一些帖子,以便了解何时应该使用模拟对象。真的我不知道什么时候必须使用模拟对象。我举了一本书Growing Object-Oriented Software, Guided by Tests的例子:

context.checking(new Expectations() {{
    oneOf (turtle).turn(45);
}});

用法很简单:

turn方法只执行一次吗?如果是真的测试将通过。如果没有测试将失败。这是我对模拟对象的理解。

<{3}}中的Martin Fowler说:

  

模拟使用行为验证,我们检查SUT是否在协作者上进行了正确的调用。

但我的问题是,如果我们想要对SUT进行单元测试,我们需要验证协作者对象的行为(在本例中为turtle)?

1 个答案:

答案 0 :(得分:1)

正如所建议的那样,Martin Fowler撰写了一篇非常有趣的文章http://goo.gl/85qY,您可以通过示例真实地看到模拟和存根的概念。

首先澄清一下你是否需要模拟或存根。

模拟是关于行为或方法。

  

模拟是我们在这里所讨论的:预先编程了预期的对象,形成了预期会收到的调用的规范。

当您进行单元测试时,您应该模拟该类的协作者,因为它们没有经过测试。例如,您用来持久化数据源的对象,因为在单元测试期间您不想持久保存任何内容,请与系统的其他部分隔离进行测试。

<强>存根

  

Stubs为测试期间的调用提供了固定的答案,通常根本不会对测试中编程的任何内容做出任何响应。存根还可以记录有关呼叫的信息,例如记住它发送的消息的电子邮件网关存根,或者可能只记录它发送的消息的数量。

看一下Mockito实例http://goo.gl/zujvY,以便了解模拟框架可以做什么,但在澄清之前是否要测试行为或对象的状态。