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