关于单元测试的问题,我怎么测试类的私有方法呢?

gccr 人人贷 服务器端工程师  2006-06-20 09:28:09
如题,多谢各位有经验的GGJJDDMM帮忙,有分嘀!
...全文
419 4 打赏 收藏 举报
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
wangqi19820913 2006-10-24
数据库程序:DBUnit
网络程序:htmlUnit、httpUnit
  • 打赏
  • 举报
回复
gccr 2006-10-10
多谢楼上两位,那么数据库程序,网络程序如何进行单元测试呢?
  • 打赏
  • 举报
回复
ysai 2006-06-21
私有方法肯定是要被调用的,否则那段代码就是废代码
比如函数A私有,而函数B公有并调用了函数A,那直接测试B不就行了?
  • 打赏
  • 举报
回复
wudi_1982 2006-06-21
不明白你想怎么测试,如果只是简单的测试功能,那么直接测试不就完了,或者是先把私有改成公有的。。
当然,除了这些也有别的办法,例如用DELPHI中的tlist举例。看看TLIST的源码,你会发FCount是一个私有域,理论上我们无法直接访问。但看看他的源码,我们可以注意到一点,我们看到,Count读是直接读FCount的值,而写操作是调用SetCount()函数。仔细思考一下这个问题:既然“Count读是直接读FCount的值”,那么,Count的地址是不是也直接指向FCount呢???
让我们用一段代码来证明它:

program testFixCount;
uses classes, Dialogs, sysUtils;
var t : TList;
pCount : ^Integer;
begin
t := TList.create;
pCount := @t.Count; //取得地址?
ShowMessage(IntToStr(pCount^));
t.Count := 10000;
ShowMessage(IntToStr(pCount^));
end.

很明显,pCount成功地得到了FCount的地址。我们可以很快完成这样的一段代码来测试对FCount私有域的直接写访问:

program testFixCount;
uses classes, Dialogs, sysUtils;
var t : TList;
pCount : ^Integer;
begin
t := TList.create;
pCount := @t.Count;
pCount^ := 10;
showMessage(IntToStr(t.Count));
end.


如果域不提供公用访问接口,那么,也就无法取到它的地址。
再看源码,我们发现,在private域的定义中,FList和FCount被连续定义,从数据结构的角度来看,通常它们在内存中占用连续的空间。事实上,在Delphi中也正是如此处理的。因此,我们只需要得到FList的地址,并用“@List+SizeOf(PPointerList)”,就可以得到FCount的地址了。
这意味着,只要我们可以突破一个私有域,我们就可以通过地址计算的方法来突破全部的私有域!

  • 打赏
  • 举报
回复
相关推荐
发帖
Delphi
加入

5067

社区成员

Delphi 开发及应用
申请成为版主
帖子事件
创建了帖子
2006-06-20 09:28
社区公告
暂无公告