码迷,mamicode.com
首页 > 其他好文 > 详细

ut一个私有变量的学习

时间:2016-05-12 22:23:57      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:

<html>
<body background="../picture/bg_body.gif"></body>
<pre>
public class PmMmlExport {
    private DebugPrn logger = new DebugPrn(PmMmlExport.class.getName());
    private boolean mmlAsyn;

    private ExportUtil exportUtil = new ExportUtil();
    private CSVProcess csvProcess = null;
    private String[] CounterIDs = null;

    public PmMmlExport(boolean mmlAsyn) {
        this.mmlAsyn = mmlAsyn;
    }

    public CSVProcess getCSVProcess() {
        return this.csvProcess;
    }

    public String[] getCounterIDs() {
        return CounterIDs;
    }

    public void setCounterIDs(String[] counterIDs) {
        CounterIDs = counterIDs;


----------------------------------------------------------------------------------


public class ExportUtil {

    private static DebugPrn logger = new DebugPrn(ExportUtil.class.getName());

    public ExportUtil() {
        initDir();
    }

    public void initDir() {
        String tmpDir = PathUtil.getTmpCmDir();
        if (new File(tmpDir).exists()) {
            FileUtil.clear(tmpDir);
        } else {
            FileUtil.mkdirs(tmpDir);
        }
    }


</pre>

----------------------------------------------------------------------------------

<p>场景:</p>

<p>需要对PmMmlExport 中的某个方法进行“UT”,所以创建这个类的对象,
这个类中定义了成员变量private ExportUtil exportUtil = new ExportUtil()<br/>
在创建对象的时候,exportUtil 会被初始化,但是 ExportUtil  构造方法里调用了系统提供的方法,这个方法在系统运行时才会“有效”<br/>
所以,创建PmMmlExport 的对象就会失败</p>

<br/>
<br/>
<br/>

<p>解决方案:</p>

<p>方案一:因为成员变量(exportUtil )”是private,通过继承PmMmlExport ,再创建对象“避免”成员变量(exportUtil )初始化</p>
<p>错误:私有变量会“继承(是不是继承??)”到子类中,只是子类无法直接访问(通过方法才可以)
      不论私有,public,protected都会被子类继承</p>


<p>方案二:在子类中,重新声明和初始化成员变量(exportUtil )为private ExportUtil exportUtil = null,通过这种方式覆盖</P>
<p>错误: <br/>
1)从父类继承的成员变量,其访问控制符仍然相同。<br/>
2)子类定义与父类同名的成员变量,并没有覆盖父类的成员变量,而是两个成员变量共存。</p>


<p>对象在创建的时候,成员变量就会被“初始化”<br/>
方案一中的思路是“通过继承”“屏蔽”父类中的private成员变量(可见无法屏蔽)<br/>
方案二中的思路是“通过声明相同名称的成员变量,覆盖继承自父类的”(两者共存)</p>


<p><font color="red">思路调整:</font>
上面的操作没有意识到这个问题:在创建对象时,成员变量的“初始化”也就在这个过程中,<br/>
init不成功,对象也就无法创建成功<br/>
所以,mock的思路是:在new class()之前,就应该对private的成员变量实施mock了</p>
<br/>
<br/>
<br/>

<p>按照这个思路进行其他方案设计:</p>

<p>方案三:通过“匿名类”,重写构造方法,在“构造方法”里,替换“成员变量”,
<br/>关键问题在于,构造方法是在成员变量初始化之前还是之后</p>

<p>方案四:通过反射得到“成员变量”的过程,不需要创建具体的对象,<br/>但是在“替换”成员变量值的基础还是创建“对象”</p>



</html>

ut一个私有变量的学习

标签:

原文地址:http://blog.csdn.net/wxbo1/article/details/51355162

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!