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

在下面的程序中,我试图在我的测试用例中使用带有junit的 mockito 。 但我不知道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工作正常。

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

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

什么是模拟炸弹? 这只是一个没有做任何事情的假炸弹。 它只是允许validation是否被要求爆炸。 所以你测试雷管的代码是这样的:

 // 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,并validation它是否正常工作。 模拟DAO也可以用作存根 ,即一个返回你告诉它在测试中返回的对象,而不是实际查询数据库。 这就是你在问题代码中所做的事情:你告诉模拟MyClass实例,当使用2和2作为参数调用add()时,它应该返回4。

这使得测试更容易设置,运行更快,并且与DAO的实际代码无关,这不是您想要在服务的unit testing中测试的。