论坛首页 综合技术论坛

单元测试如何应对以下2个简单的情况

浏览 18071 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-06-07  
你自己都new了,还指望人家测试类怎么给你mock?
重构才是正道
0 请登录后投票
   发表时间:2006-06-07  
ok,现在的问题就是如何重构?
0 请登录后投票
   发表时间:2006-06-08  
lzqjj 写道
ok,现在的问题就是如何重构?

写一个setter方法,然后注入mock对象就ok了
why not?
0 请登录后投票
   发表时间:2006-06-08  
我的做法:
1)首先这个变量从局部变量改为成员变量;
2)提供一个 setter 设置这个成员变量;
3)在需要使用这个成员变量的地方,判断这个变量是否为 null, 如果为 null 就构建一个(当然你可以使用一个 get 方法来隐藏这段逻辑);

这样在单元测试的时候我们可以 set 进去这个依赖对象(可以是我们 Mock 出来的伪造对象), 而正常运行的时候就保持和原来逻辑一致;

当然这个方法只是权宜之计.
0 请登录后投票
   发表时间:2006-06-08  
to:glassprogrammer
非常感谢你的回答。我的想法和你一模一样(特别是第3条)。只是有些不太确定的地方:
1、变量从局部升级成为了成员变量,这样会有什么负面影响吗?极端情况下,我只有一个方法需要这个变量。
2、对于你的第3条回答,我也是首先判断这个变量是否为null,如果是,则才直接new一个,否则,直接使用这个变量。这样做的目的确实是方便了单元测试的setter注入。不过你说这个只是权宜之计,不知道除了这种方法外,还有什么其它更好的办法??
3、延伸开来,是不是尽量尽量不要直接new一个对象?
0 请登录后投票
   发表时间:2006-06-08  
只有一个方法需要就传给那个方法
尽量不要直接new一个对象,除了内部类
运用之妙,存乎一心
0 请登录后投票
   发表时间:2006-06-09  
“只有一个方法需要就传给那个方法”---???如何传给方法???
0 请登录后投票
   发表时间:2006-06-09  
OtherClass oc = new OtherClass();; 

改成
 OtherClass oc = OtherFactory.getFactory();.getOtherClass();; 

这样就很容易mock了。
0 请登录后投票
   发表时间:2006-06-09  
lzqjj 写道
“只有一个方法需要就传给那个方法”---???如何传给方法???

由调用那个方法的对象实例化它,再作为参数传给那个方法啊,这有什么问题吗?还是我理解错你的意思了?
0 请登录后投票
   发表时间:2006-06-09  
LZ,推荐看一看gigix翻译的"重构"
Author:Martin Flower
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics