精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-01-08
taowen 写道 参考Martin Fowler的这篇文章:
http://www.martinfowler.com/articles/mocksArentStubs.html 区别就在于测试是基于状态的还是基于交互的。个人比较喜欢基于状态的,使用Mock也不喜欢做verify,拿来当stub用。 实在是高哇,我怎么就没想到呢,哈哈 我太死心眼儿了,一直都严格的verify,搞得测试用例很脆弱 |
|
返回顶楼 | |
发表时间:2007-01-09
lane_cn 写道 你的感觉是对的,mock的方式其实就是在测试类的实现过程,已经不仅仅是在测试接口了。
对于一个代码来说,如果你测试他的时候感觉非mock不可,不然就没什么可测的,其实他的设计就已经出问题了,一定是各个功能模块的耦合性太高了。 mock和stub的区别是很大的,简单的说:mock是在测试一个类的内部是否正确;stub是假设这个类的接口完全正常,用它去测试其他的类。 难道mock不是假设你mock的对象是正常的么? 感觉mock 跟stub的区别不是大。 |
|
返回顶楼 | |
发表时间:2007-01-09
stub是按照接口的定义造出一个假的对象,比如StubA,要按照A的定义,输入该输入的对象,输出该输出的对象,抛出该抛出的异常,然后拿着StubA去测试依赖A的另一个类。
mock是预定好一个方法,去检查执行的对不对。比如A是一个类,他有一个SendMail方法,调用B类发送一个email: class A { void SendMail() { b.SendIt(xxx); } } 通过接口我们无法测试这个email的实际发送情况,于是我们就做一个MockB,在MockB里面录制一个SendIt,然后把A运行一下,看看MockB里面录制的SendIt是不是被执行了,参数是不是预定的参数。于是就测试了SendMail这个方法的细节。 很多情况下mock都是可以避免的,比如有人使用mock是为了测试这样的情况:A对象将设备设置成某个状态,然后B对象依靠这个状态进行某项工作。于是他必须mock一个设备出来,检查A对象对设备的操作对不对。 这个设计其实有问题,既然A和B都和这个设备有关系,就应该要么让A和B合成一个类,要么让B依靠A,A独立负责这个设备状态的一致性。 这样的话,即使A的内部错翻天了,实际设备的状态根本不对,但是只要A的接口是正确的,从外界看上去象对的一样,就不会对B造成任何影响。mock的作用也就降到最低了。 |
|
返回顶楼 | |