ut一个私有变量的学习

<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>

时间: 2024-10-07 08:18:17

ut一个私有变量的学习的相关文章

私有变量

严格来讲,Javascript中没有私有成员的概念:所有对象属性都是公有的.不过,倒是有一个私有变量的概念.任何在函数中定义的变量,都可以认为是私有变量,因为不能再函数的外部访问这些变量.私有变量包括函数的参数.局部变量和在函数内部定义的其他函数.来看下面的例子: function add(num1,num2){ var sum = sum1 + sum2; return sum; } 在这个函数内部,有三个私有变量:num1.num2和sum.在函数内部可以访问这个变量,但在函数外部则不能访问

Java Reflection(七):私有变量和私有方法

转载自并发编程网 – ifeve.com 内容索引访问私有变量访问私有方法 在通常的观点中从对象的外部访问私有变量以及方法是不允许的,但是Java反射机制可以做到这一点.使用这个功能并不困难,在进行单元测试时这个功能非常有效.本节会向你展示如何使用这个功能. 注意:这个功能只有在代码运行在单机Java应用(standalone Java application)中才会有效,就像你做单元测试或者一些常规的应用程序一样.如果你在Java Applet中使用这个功能,那么你就要想办法去应付Securi

property,私有变量

# 如果要让内部属性不被外部访问,可以把属性的名称前加两个下划线__,在python中,实例的变量如果以__双下划线开头,就变成了一个私有变量(private),z只有内部可以访问,外部不能访问. ### gender改为私有变量的案例: """class Student(object): def init(self, |name, gender): self.name = name self.__gender = gender def set_gender(self,gen

浅谈class私有变量

class的前世今生 在 es6 之前,虽然 JS 和 Java 同样都是 OOP (面向对象)语言,但是在 JS 中,只有对象而没有类的概念. 在 JS 中,生成实例对象的传统方法是通过构造函数,如下所示: function A (x) { this.x = x } // 在原型链上挂载原型方法 A.prototype.showX = function () { return this.x } // 生成对象实例 let a = new A(1) // 调用原型方法 a.showX() //

ES6 class类中定义私有变量

ES6 class类中定义私有变量 class类的不足 看起来, es6 中 class 的出现拉近了 JS 和传统 OOP 语言的距离.但是,它仅仅是一个语法糖罢了,不能实现传统 OOP 语言一样的功能.在其中,比较大的一个痛点就是私有变量问题. 何为私有变量?私有变量就是只能在类内部访问的变量,外部无法访问的变量.在开发中,很多变量或方法你不想其他人访问,可以定义为私有变量,防止被其他人使用.在 Java 中,可以使用 private 实现私有变量,但是可惜的是, JS 中并没有该功能. 来

C++ 的一个问题的理解(私有变量成员)

class CExample { public: CExample(){pBuffer=NULL; nSize=0;} ~CExample(){delete pBuffer;} CExample(const CExample&); void Init(int n){ pBuffer=new char[n]; nSize=n;} private: char *pBuffer; int nSize; }; CExample::CExample(const CExample& RightSide

单例下并发的情况下访问私有变量的一个典型问题

一个小问题,单例下 并发的情况下访问私有变量的典型问题,以下是一个小Demo public class dssd { static void Main(string[] args) { var t = Task.Factory.StartNew(() => { Thread.Sleep(1000); var obj2 = ImportProvider.Instance; Arg ds = new Arg() { TypeSS = 2 }; obj2.Import(ds); }); var obj

《javascript设计模式与开放实践》学习(四)私有变量

为了避免全局变量被污染,可采用加命名空间和闭包封装方式进行私有化. 一.使用命名空间 将某个变量变成某个命名空间下私有变量 var MyApp={}; MyApp.namespace=function (name) { var parts=name.split('.'); var current=MyApp; for(var i in parts){ if(!current[parts[i]]){ current[parts[i]]={}; } current=current[parts[i]]

java ThreadLocal线程设置私有变量底层源码分析

前面也听说了ThreadLocal来实现高并发,以前都是用锁来实现,看了挺多资料的,发现其实还是区别挺大的(感觉严格来说ThreadLocal并不算高并发的解决方案),现在总结一下吧. 高并发中会出现的问题就是线程安全问题,可以说是多个线程对共享资源访问如何处理的问题,处理不当会的话,会出现结果和预期会完全不同. 一般情况下,多个线程访问一个变量都是公用他们的值,不过有时候虽然也是访问共享变量,不过每个线程却需要自己的私有变量.这个时候ThreadLocal就有用武之地了.下面是个ThreadL