在下面的程序中,我尝试在我的测试用例中使用mockito和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)一个对象一样?感谢您的帮助!
答案 0 :(得分:8)
您的测试不会测试您的任何代码。它测试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也可以用作存根,即返回您在测试中返回的内容的对象,而不是实际查询数据库。这就是你在问题代码中所做的事情:你告诉模拟MyClass实例,当用{2}和2作为参数调用add()
时,它应该返回4。
这使得测试更容易设置,运行更快,并且与DAO的实际代码无关,这不是您想要在服务的单元测试中测试的。