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

标签 java unit-testing

在下面的程序中,我尝试使用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));
      }
   }

我的实际类(class)(MyClass.java)

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

它是模拟对象,与注入(inject)(DI)对象相同吗?感谢您的帮助!

最佳答案

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

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

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

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

// 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 实例,当 add() 时使用 2 和 2 作为参数调用,它应该返回 4。

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

关于java - 使用 Mokito 时,实际对象和模拟对象有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28783722/

相关文章:

JavaFX Web View : ignoring setPickOnBounds?

python - 如何将 passenv 添加到 tox.ini 而不编辑文件,而是通过在代理后面的 Jenkins 中的 virtualenv shell nature 脚本中运行 tox (python)

c# - 如何在 stub 上没有 setter 的情况下设置属性的值?

java - 如何使用java 10的Application Class-Data Sharing特性?

android - 我如何在android中为挂起功能和状态流编写单元测试

java - org.mockito.exceptions.misusing.InvalidUseOfMatchersException 有效表达式

ios - UIStoryboardScene 意外地释放其 Controller 而不更改保留计数

java - 返回从一个类调用到另一个类的列表

java - 从终端执行 java 项目 jar 时出现错误

java - 在 Android 中通过调用 Service 的公共(public)函数来向 Service 发送请求好不好?