Topic: 如何对下面的类进行单元测试? |
Print this page |
1.如何对下面的类进行单元测试? | Copy to clipboard |
Posted by: kuyacai Posted on: 2004-08-25 09:52 有这样一个类,如何进行单元测试 需要进行测试的类 public class HelloWord{ private SystemConfig cfg; public HelloWord(){} public HelloWord(SystemConfig cfg){ this.cfg = cfg; } public void setCfg(SystemConfig cfg){ this.cfg = cfg; } public String getWord(){ boolean flag = cfg.getXXXXX();//根据系统配置取得某个开关变量。 String val = ""; if(flag){ val = "OK";//实际上这儿会是一些业务逻辑处理 }else{ val = "Error"; } return val; } } public class SystemConfig implements ConfigDataListener{ private static SystemConfig cfg; private SystemConfig() { //加载一些配置信息 doConfigRefresh(); } //返回一个单例实例 public static SystemConfig getInstants() { synchronized(SystemConfig.class){ if(cfg == null){ cfg = new WebConfig(); } } return cfg; } public void doConfigRefresh() { //读配置等 } //下面是一些getter方法。 } 在对HelloWord进行单元测试时,可以采用Mock objects的方式,对SystemConfig创建一个模拟对象。然而SystemConfig用的是私有构造器,没法继承。 并且如果要加载SystemConfig的话,需要加载容器等,这显然不是我要测试HelloWord要做的事情,并且,在单元测试时,我需要尽可能的隔离外部依赖。 请问有什么好办法?谢谢! 我采用的是Junit测试框架。 |
2.Re:如何对下面的类进行单元测试? [Re: kuyacai] | Copy to clipboard |
Posted by: emarket Posted on: 2004-08-28 16:51 如果你只是要测试 HelloWord 的话, 1. 对SystemConfig extract interface 作一个新的interface , SystemConfigInterface. 2. 把 helloworld 的参数改称 SystemConfigInterface , 这样你就可以用 jMock or easy mock , mock 一个 SystemConfigInterface了 但是我真正担心的是 你如何 测试 SystemConfig, 这是一个所谓的 singleton, 不大清楚你的context, 但是至少我知道 在J2EE, 和 distributed app 中 singelton是 不可以依赖的。 另外 Singleton is a evil to TDD 具体的一些讨论http://www.c2.com/cgi/wiki?search=singleton 一些可能的建议 1. 加一个 reset在 singleton 2. 该他的 constructor to pulbic 3. 用 flyweight代替 singleton 不过这些都有些不完美 另外关于singleton的 文章 Use your singletons wisely http://www-106.ibm.com/developerworks/webservices/library/co-single.html 你可以读读 |
3.Re:如何对下面的类进行单元测试? [Re: kuyacai] | Copy to clipboard |
Posted by: kuyacai Posted on: 2004-08-31 13:20 多谢emarket! 对于helloword的测试我们的想法不谋而和。 由于我们的项目在开始阶段并没有引入单元测试,这个项目已经历时一年多了,并且已经正式上线,当然现在也一直在做新功能。公司从今年开始狠抓质量,就要求我们引入单元测试。在引入单元测试后,项目组中一直有一种声音,不能因为单元测试而重构我们的程序代码。因为这样,所以就提出了上面的问题。 但最终,在我负责的team中,还是对这些代码进行了重构,并且在进行单元测试过程中,也发现了一些以前得设计不合理的地方。 的确,对于SystemConfig的测试很痛苦,还没有什么好办法,不过,根据项目组的要求,单元测试并不是要求100%,所以这个地方就暂时放过去了。 再次感谢1 |
4.Re:如何对下面的类进行单元测试? [Re: kuyacai] | Copy to clipboard |
Posted by: emarket Posted on: 2004-08-31 20:09 对于 systemConfig 这种 singleton, 还有两个办法就是, 用一个专门的jvm去 跑它,每种不同的情况用一个单独的jvm来跑。 ant里面有些参数设置 可以做到 , 有兴趣的可以研究一下。 或者,自己写一个 class loader, 在不同的test中 用不同的classloader。 不过 这些方法都是 有点出力不讨好了。 轻易的放过某个class不是一个好的办法,好的办法就是去 refactoring, 只有 unit test 达到了 100% 的 cover, refactoring才是安全的,否则你将永远生活在"change"的恐惧中。 另外还要注意让 QC多写些 functional test! |
Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1 客服电话 18559299278 客服信箱 714923@qq.com 客服QQ 714923 |