mock私有变量的时候出现的问题
2016-05-06 20:34
316 查看
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);
}
}
----------------------------------------------------------------------------------
场景:
需要对PmMmlExport 中的某个方法进行“UT”,所以创建这个类的对象,
这个类中定义了成员变量private ExportUtil exportUtil = new ExportUtil()
在创建对象的时候,exportUtil 会被初始化,但是 ExportUtil 构造方法里调用了系统提供的方法,这个方法在系统运行时才会“有效”
所以,创建PmMmlExport 的对象就会失败
解决方案:
方案一:因为成员变量(exportUtil )”是private,通过继承PmMmlExport ,再创建对象“避免”成员变量(exportUtil )初始化
错误:私有变量会“继承(是不是继承??)”到子类中,只是子类无法直接访问(通过方法才可以)
不论私有,public,protected都会被子类继承
方案二:在子类中,重新声明和初始化成员变量(exportUtil )为private ExportUtil exportUtil = null,通过这种方式覆盖
错误:
1)从父类继承的成员变量,其访问控制符仍然相同。
2)子类定义与父类同名的成员变量,并没有覆盖父类的成员变量,而是两个成员变量共存。
对象在创建的时候,成员变量就会被“初始化”
方案一中的思路是“通过继承”“屏蔽”父类中的private成员变量(可见无法屏蔽)
方案二中的思路是“通过声明相同名称的成员变量,覆盖继承自父类的”(两者共存)
思路调整:
上面的操作没有意识到这个问题:在创建对象时,成员变量的“初始化”也就在这个过程中,init不成功,对象也就无法创建成功
所以,mock的思路是:在new class()之前,就应该对private的成员变量实施mock了
但是powerMock中的操作实际上是对
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);
}
}
----------------------------------------------------------------------------------
场景:
需要对PmMmlExport 中的某个方法进行“UT”,所以创建这个类的对象,
这个类中定义了成员变量private ExportUtil exportUtil = new ExportUtil()
在创建对象的时候,exportUtil 会被初始化,但是 ExportUtil 构造方法里调用了系统提供的方法,这个方法在系统运行时才会“有效”
所以,创建PmMmlExport 的对象就会失败
解决方案:
方案一:因为成员变量(exportUtil )”是private,通过继承PmMmlExport ,再创建对象“避免”成员变量(exportUtil )初始化
错误:私有变量会“继承(是不是继承??)”到子类中,只是子类无法直接访问(通过方法才可以)
不论私有,public,protected都会被子类继承
方案二:在子类中,重新声明和初始化成员变量(exportUtil )为private ExportUtil exportUtil = null,通过这种方式覆盖
错误:
1)从父类继承的成员变量,其访问控制符仍然相同。
2)子类定义与父类同名的成员变量,并没有覆盖父类的成员变量,而是两个成员变量共存。
对象在创建的时候,成员变量就会被“初始化”
方案一中的思路是“通过继承”“屏蔽”父类中的private成员变量(可见无法屏蔽)
方案二中的思路是“通过声明相同名称的成员变量,覆盖继承自父类的”(两者共存)
思路调整:
上面的操作没有意识到这个问题:在创建对象时,成员变量的“初始化”也就在这个过程中,init不成功,对象也就无法创建成功
所以,mock的思路是:在new class()之前,就应该对private的成员变量实施mock了
但是powerMock中的操作实际上是对
相关文章推荐
- POJ3177 Redundant Paths
- C经典 结构图的三种定义方式
- cocos-js,时间相关的处理
- Hadoop HDFS Tools
- 手工MAVEN建立WEBAPP项目并打包部署
- lightoj 1074 spfa判断负环
- 日记帐导入-来源为“采购”日记帐导入失败问题
- 文件传输基础—Java IO流 FileInputStream 的运用
- deep learning 练习1 线性回归练习
- 虚拟化_KVM
- 代理模式:控制对对象的访问
- 前端-js-this
- CentOS允许/禁止ping的方法
- IE7-span折行问题
- HDU 3639 Hawk-and-Chicken tarjan缩点+dfs
- Android去除题栏
- C++实验5——数组分离
- POJ 1573 Robot Motion
- java集合09--Map架构
- 状态模式:把执行的动作封装在跟状态有关的类里,由状态来决定动作该如何执行