使用Mokito时,实际对象和模拟对象之间有什么区别?
在下面的程序中,我试图在测试用例中将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)一样?我感谢您的帮助!
-
您的测试不会测试您的任何代码。它测试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也可以用作
存根
,即返回您告诉它在测试中返回的内容的对象,而不是实际查询数据库。这就是您在问题代码中所做的事情:您正在告诉模拟MyClass实例,当add()
以2和2作为参数调用时,它应该返回4。这使测试更易于设置,运行速度更快,并且独立于DAO的实际代码,而DAO并不是您要在服务的单元测试中测试的代码。
-
python对象和json对象之间有什么区别?
2021-01-29 关注 0 浏览83 1答案
-
本机对象和宿主对象之间有什么区别?
2021-02-02 关注 0 浏览97 1答案
-
之间有什么区别?Java泛型中的对象和对象?
2021-01-29 关注 0 浏览130 1答案
-
JSON和JavaScript对象之间有什么区别?
2021-02-02 关注 0 浏览106 1答案
-
使用JSON数组与JSON对象之间有什么区别?
2021-01-31 关注 0 浏览110 1答案
-
Python字典和Javascript对象之间有什么区别?
2021-01-29 关注 0 浏览453 1答案
-
“ new Object()”和对象文字符号之间有什么区别?
2021-02-02 关注 0 浏览99 1答案
-
Java中的HashMap和Map对象之间有什么区别?
2021-02-02 关注 0 浏览82 1答案
-
Javascript对象和JSON对象有什么区别
2021-01-31 关注 0 浏览97 1答案
-
对象和数据结构之间有什么区别?
2021-01-29 关注 0 浏览131 1答案