问题描述
再非TDD的测试中,会遇到写测试的时候想对一段逻辑(通常是函数)进行测试却发现这个函数是private在测试,不能访问的问题.遇到这种情况我一般有两种方式处理1. 将该函数声明为public的, 但是这样破坏了这个类的封装性2. 将函数声明为protected,然后将测试类放在同样的包下(不同的源码包), 但是也不是很好所以在非TDD的测试中,更多的是进行最粗粒度的service层(类似于API)的测试.现在偶在尝试TDD, 让domain有更多的职责使其丰富起来,但是这个问题依然困扰我.那么TDD是不是应该避免这个问题呢?我对于TDD是这样理解的,更多的是通过测试来进行设计,在编写测试的过程中将对象之间的交互和关系体现出来,因此主要针对Service层(系统对外部提供API)以下的测试如果我遇到在非TDD测试中访问private函数的问题的时候,我是不是就应该考虑1. 自己过于关注细节,只要看结果即可2. 是不是应该将这个方法放到其它的类中,由这个类提供public方法出来,并且根据这个类编写另外的测试(tell don't ask)不知道我对此的理解是否正确问题补充三楼发的几个链接相当不错,很全面详细地说了几种测试private的方法别的没有记住.老外的那个比喻太搞了just like mother used to say not to expose your private!!!相当雷人哈
解决方案
一般不测试private方法的,貌似都是对面向对象超级精通的大牛。人家知道哪个方法应该是private,哪些不是。对于我等彩笔,还是老老实实的写吧。http://www.artima.com/suiterunner/private2.htmljava 单元测试,使用反射, 以及一个PrivateMethodAccessor 类。来实现。缺点是测试代码比较冗长。http://kailuowang.blogspot.com/2010/08/testing-private-methods-in-rspec.htmlhttp://blog.jayfields.com/2007/11/ruby-testing-private-methods.htmlruby: (rspec), 在每个test之前,将目标方法从 private 改成 public, 之后再改回来。http://www.ruby-forum.com/topic/78762好几个人都不赞同测试private method
解决方案二:
iamlotus 写道你设计一个POS机程序的时候会测试银行内部是如何转账的吗?另外,有这个问题说明混淆了Test Driven 于 Test First。需要测试private的流程都不是TDD,最多是Test First Development。预先写了个interface就开始写full test,写着写着发现function的scope太大,分支太多,testcase不好写,于是就想直接测private function是不是简单点。这还是 Design在前的一套,只不过把 Design->Code->Test 的顺序变成了 Design->Test->Code。TDD讲究的是设计从重构中来,而不是预设计,TDD要求的第一点就是Testable,被抽取的责任需要验证的话就用一个单独的class去实现,怎么会有需要单独测试的private方法呢?这不是教条么?虽然说得有理,但是完全没有Desing就开始Test,有太大意义么?
解决方案三:
你设计一个POS机程序的时候会测试银行内部是如何转账的吗?另外,有这个问题说明混淆了Test Driven 于 Test First。需要测试private的流程都不是TDD,最多是Test First Development。预先写了个interface就开始写full test,写着写着发现function的scope太大,分支太多,testcase不好写,于是就想直接测private function是不是简单点。这还是 Design在前的一套,只不过把 Design->Code->Test 的顺序变成了 Design->Test->Code。TDD讲究的是设计从重构中来,而不是预设计,TDD要求的第一点就是Testable,被抽取的责任需要验证的话就用一个单独的class去实现,怎么会有需要单独测试的private方法呢?
解决方案四:
我觉的不该测试private方法,本身private方法一定会被protected or public方法所调用,那些才是应该测试的
解决方案五:
为什么会出现private方法?用TDD方式写程序,会产生楼主这个问题吗?
解决方案六:
不加任何修饰,然后测试代码和目标类同一个包名下。
解决方案七:
本身就不需要测试private方法~哪个SB第一个想出来要TDDprivate方法的?吃饱饭没事情做啊?
解决方案八:
不是将private修改为protect及public.而是修改成 package,包内可见.满足测试需要即可,千万不要还搞反射等SB玩意.
解决方案:
我想知道,private方法是怎么来的?
解决方案:
1 如果可以正确的判定方法的访问类型,则不用测试private。2 如果你是搞卫星,火箭,金融,医疗,还是测试一下吧。
解决方案:
sg552 写道一般不测试private方法的,貌似都是对面向对象超级精通的大牛。人家知道哪个方法应该是private,哪些不是。对于我等彩笔,还是老老实实的写吧。http://www.artima.com/suiterunner/private2.htmljava 单元测试,使用反射, 以及一个PrivateMethodAccessor 类。来实现。缺点是测试代码比较冗长。http://kailuowang.blogspot.com/2010/08/testing-private-methods-in-rspec.htmlhttp://blog.jayfields.com/2007/11/ruby-testing-private-methods.htmlruby: (rspec), 在每个test之前,将目标方法从 private 改成 public, 之后再改回来。http://www.ruby-forum.com/topic/78762好几个人都不赞同测试private method 主要是太麻烦了....为测试个private方法还得动用反射 测试出错可能性大大超过源码业务逻辑错误.如果需要测试 设计时不要设计成private才是王道 .PS:私有,公有之间还有两种声明方式的.....
解决方案:
这样的争论在tdd社区中已经持续了很长时间了。一般的看法是不应该单独测试private的方法,而应该通过测试public的方法间接达到多private的覆盖。其实,当你需要测试private方法的时候,更应该问你自己的问题是,我真的需要测试这个吗?有没有可能吧这个逻辑抽出到另外一类中?