使用 Mokito 时,实际对象和模拟对象有什么区别?

2023-12-06

在下面的程序中,我尝试使用mockito with junit在我的测试用例中。但我不明白 Mokito 如何帮助我的测试创建对象?我在这里没有看到任何特别的东西,因为看起来 mokito 正在实例化实际的对象。

   public class TestCase1{

    @Mock 
    MyClass myClass;

    public void setup(){

       MokitoAnnotations.initMoks(this);

       }
       @Test
       public void testAddition(){

         when(myClass.add(2,2)).thenReturn(20);
         assertEquals(4,myClass.add(2,2));
      }
   }

我的实际班级(MyClass.java)

    public class MyClass{
        public int add(int x, int y){
           return x+y;
        }
    }

它是模拟一个对象,与注入(DI)一个对象一样吗?我感谢您的帮助!


您的测试不会测试您的任何代码。它测试 Mockito 是否正常工作。

当我介绍模拟的概念时,我举了一个例子:假设您构建了一个雷管,并且想要测试它。你当然可以将雷管与真正的炸弹一起使用,看看当你使用雷管时整个方块是否爆炸。但这不太实用。顺便说一句,也许你甚至没有可用的炸弹。也许您的同事仍在构建它。

所以你使用模拟炸弹。请注意重要的一点:要测试雷管,您需要使用模拟炸弹。不是模拟雷管。被嘲笑的是依赖性被测班级的。不是被测试的类本身。

什么是模拟炸弹?这只是一个假炸弹,没有任何作用。它所做的只是验证是否已被要求爆炸。所以测试雷管的代码如下:

// create a mock bomb:
Bomb mockBomb = mock(Bomb.class);
// create a real detonator, but tie it to the mock bomb:
Detonator detonator = new Detonator(mockBomb);

// test the detonator. Since it's tied to a mock bomb, the block
// won't explode
detonator.pressTheRedButton();

// check it the mock bomb has been asked to explode, as it should 
// if the detonator works correctly
verify(mockBomb).explode();

现在,如果测试通过,您就知道使用的所有内部电路pressTheRedButton()工作正常并最终让炸弹爆炸。所以你知道,当与真实炸弹一起使用时,按下红色按钮时真实炸弹也会爆炸。

现在让我们回到现实世界:您想要测试一个服务,而该服务使用一个 DAO,它需要一个数据库并填充数据才能正常运行。要测试您的服务,您可以简单地模拟 DAO,并验证它是否正常工作。模拟 DAO 也可以用作stub,即返回您告诉它在测试中返回的内容的对象,而不是实际查询数据库。这就是您在问题代码中所做的事情:您告诉模拟 MyClass 实例,当add()以 2 和 2 作为参数调用,它应该返回 4。

这使得测试更容易设置、运行更快,并且独立于 DAO 的实际代码,而这不是您想要在服务的单元测试中测试的内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Mokito 时,实际对象和模拟对象有什么区别? 的相关文章

随机推荐