为什么我们需要创建模拟对象?

时间:2016-05-13 06:26:12

标签: unit-testing testing mockito

我是单位测试新手,我的经理推荐Mockito。我正在探索这个工具,但有一些困惑,如:

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

  2. 为什么我们设置任何方法的行为,使用类似'当然后'开发人员设置方法行为时的条件。

  3. 如果我们对任何方法进行存根,那么它将是静态的,如果开发人员更改该方法的代码,那么它的影响将不会出现在我们的测试用例中,它将始终通过。

  4. 例如:

       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 个答案:

答案 0 :(得分:0)

在任何情况下,首先要注意你测试的是什么。

在您的代码段中,您似乎正在测试课程TestingServices并且您不应该嘲笑这个课程,因为它的行为是您正在测试的,而不是Mockito如何工作注入您的&#39 ;假'方法回应。 实际上,在您的示例中,您正在测试Mockito是否会注入您想要的行为,并按预期工作,仅此而已。

例如:您的TestingServices类内部有一个对象,它使用第三方API并获得响应(或MVC架构中Controller使用的DAO对象)。如果您对TestingServicesController进行单元测试,那么您不希望因为依赖而失败,并且您可以模拟系统的该部分。

Mocking让您专注于测试中的类,而不是您正在测试的过程中所需的上下文或其他类,并抽象其余组件。

有很多问题在讨论这个问题: