2016-05-13 116 views
0

我是单元测试新手,我的经理推荐Mockito。我正在探索这个工具,但是有像有些混乱:为什么我们需要创建模拟对象?

  1. 为什么我们需要创建模拟对象,而我们可以创建任何类的实物。

  2. 为什么我们在开发人员设置方法的行为时,使用stubbing(如'when and then')条件设置任何方法的行为。

  3. 如果我们做任何方法的存根,那么它将是静态的,如果开发者改变了那个方法的代码,那么它的影响就不会出现在我们的测试用例中,它总是会通过。

例如:

TestingServices test = Mockito.mock(TestingServices.class); 

    // define return value for method getUniqueId() 

    System.out.println("unique id is "+test.getUniqueId()); 

    when(test.getUniqueId()).thenReturn(44); 

    assertEquals(test.getUniqueId(),44); 

在上面的代码片断assertEquals将总是通过,显影剂是否改变的代码或没有。

+1

您的测试是一个坏榜样,因为它是单元测试它的嘲讽同样的事情。在一个真实的例子中,你可以通过嘲笑B来单元测试A,以便隔离A的行为,反之亦然。然后你会有更高层次的集成测试,检查A和B在两者都不被模拟时仍然正确交互。 – jonrsharpe

+0

嗨Jonrsharpe,谢谢你给我回答。其实我的担忧是为什么我们需要疯狂的模拟物体和残肢?请解释一下,你的帮助会清除我的疑惑。 –

+0

嗨Exoddus,你可以给我更多的例子,当我们创建模拟对象或当不需要创建它。 –

回答

0

首先是照顾你在任何情况下测试什么。

在你的代码片段中,似乎你正在测试类TestingServices,你不应该嘲笑这个类,因为它的行为是你正在测试的,而不是Mockito如何工作注入你的'假'方法响应。 实际上,在你的例子中,你正在测试Mockito注入你想要的行为,并按预期工作,仅此而已。

例如:您的TestingServices类内部有一个对象,它使用第三方API并获得响应(或MVC体系结构中的Controller使用的DAO对象)。如果你正在测试你的TestingServices或你的Controller,你不想失败,因为依赖,你可以嘲笑系统的这一部分。

模拟让你专注于被测试的类而不是你正在测试的过程中需要的上下文或其他类,并且抽象出其余的组件。

有很多谈论这个问题:

+0

所以当我们需要创建模拟对象时,请给我一些例子。 –

+1

Mohd,我正在用您提供的代码回答您的问题。如果需要关于嘲笑的具体示例,那么肯定会发现很多搜索'java模拟示例'的示例肯定:) – exoddus

相关问题