Non-Public members unit testing

如果单元测试代码与项目源代码都在同一个项目下的话那么单元测试代码就可以测试到项目代码中的internal成员了,但是对于private等成员却是无能为力。一般情况下我们不会需要覆盖私有或受保护(protected)成员变量,但是我们会遇到很多需要测试私有方法的情况,比如一个逻辑复杂的公共方法可能会调用到多个小私有方法,这些小私有方法在责任的划分上是有独立性的。也就是说,在单元的意义上讲这些小方法也应该有各自独立的单元测试,这样会大大方便往后的调试工作(如果真的有需要的话)。现在的问题是,因为它们是私有的,所以无法直接对其进行访问,解决方案目前有两种;一种是改变private为internal或public方便单元测试,然后在最终发布前将接口再改回来;另一种则是通过使用反射直接访问private成员。

第一种个人觉得不太妥当,因为接口多了难免要漏掉一些改动,而且在开发时全部接口都是public的话会引起很多误解与混乱。

第二种也有优缺点,优点很明显,不需要为测试改动接口,灵活性很强,即使Release版也可以做单元测试(前提是在Obfuscation之前,因为Obfuscation很容易影响到反射)。缺点是要考虑反射的权限问题,另外写反射需要更多比较繁琐的代码。

那么初步的选择务必会锁定在反射上,接下来要解决的问题就是简化用反射对现有对象成员访问的复杂与繁琐度,关于这一点大家可以参考Facade模式自行实现一个简化反射操作的Utilitiy Library。

posted @ 2005-07-08 00:12  Cavingdeep  阅读(1793)  评论(10编辑  收藏  举报