您的位置:首页 > 其它

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中的操作实际上是对
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: