【问题标题】:When using Mokito, what is the difference between the actual object and the mocked object?使用 Mokito 时,实际对象和模拟对象有什么区别?
【发布时间】:2015-05-01 06:23:10
【问题描述】:

在下面的程序中,我尝试在我的测试用例中使用mockitojunit。但我没有看到 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)一个对象一样吗?感谢您的帮助!

【问题讨论】:

  • 不清楚;对于一个你甚至不知道你使用的是 TestNG 还是 JUnit(提示:使用 TestNG)。
  • 你想测试什么?你熟悉模拟的概念吗?请告诉我你不是在测试 MyClass。向我们展示您的测试。阅读blog.8thlight.com/uncle-bob/2014/05/14/TheLittleMocker.html
  • 我已经编辑了问题
  • @chrylis 我知道Spock,但我不喜欢它,抱歉:p

标签: java unit-testing


【解决方案1】:

您的测试不会测试您的任何代码。它测试 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,并验证它是否正常工作。模拟 DAO 也可以用作 stub,即返回您告诉它在测试中返回的内容的对象,而不是实际查询数据库。这就是您在问题代码中所做的:您告诉模拟 MyClass 实例,当使用 2 和 2 作为参数调用 add() 时,它应该返回 4。

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

【讨论】:

  • 这是一个奇妙且特别令人回味的类比。
  • 我一直在想,引入单元测试是为了让事情变得简单,无论如何这都是真正的痛苦
猜你喜欢
  • 2011-02-22
  • 1970-01-01
  • 2011-09-23
  • 2013-06-26
  • 2011-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多