论坛首页 综合技术论坛

关于EasyMock的困惑,感觉虽然隔离了层的依赖,但却不能进行所谓的暗盒测试!

浏览 11467 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-01-08  
taowen 写道
参考Martin Fowler的这篇文章:
http://www.martinfowler.com/articles/mocksArentStubs.html

区别就在于测试是基于状态的还是基于交互的。个人比较喜欢基于状态的,使用Mock也不喜欢做verify,拿来当stub用

实在是高哇,我怎么就没想到呢,哈哈
我太死心眼儿了,一直都严格的verify,搞得测试用例很脆弱
0 请登录后投票
   发表时间:2007-01-09  
lane_cn 写道
你的感觉是对的,mock的方式其实就是在测试类的实现过程,已经不仅仅是在测试接口了。
对于一个代码来说,如果你测试他的时候感觉非mock不可,不然就没什么可测的,其实他的设计就已经出问题了,一定是各个功能模块的耦合性太高了。
mock和stub的区别是很大的,简单的说:mock是在测试一个类的内部是否正确;stub是假设这个类的接口完全正常,用它去测试其他的类。


难道mock不是假设你mock的对象是正常的么?

感觉mock 跟stub的区别不是大。
0 请登录后投票
   发表时间: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的作用也就降到最低了。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics