mock私有变量的时候出现的问题

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中的操作实际上是对

在使用Mockito框架中,可以使用反射的方式来mock一个类的私有成员。具体的步骤如下: 1. 首先,使用`@InjectMocks`注解将被测类的实例注入到测试类中。 2. 使用`@Test`注解标记测试方法。 3. 在测试方法中,使用`Class.getDeclaredField()`方法获取私有成员的Field对象。此方法需要传入私有成员的名称。 4. 使用`Field.setAccessible(true)`方法设置该Field对象的访问权限为可访问。 5. 使用`Field.set()`方法设置私有成员的值。该方法需要传入被测类的实例、私有成员的Field对象和要设置的值。 通过以上步骤,就可以成功mock一个类的私有成员。这样,在测试中就可以对私有成员进行相应的验证和断言了。 需要注意的是,通过mock私有成员可能会导致测试代码与被测方法的耦合度较高,因此在设计测试用例时需要注意权衡。此外,还可以使用其他的测试框架或技术来mock私有成员,比如PowerMock等。 希望这个回答对您有所帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Mockito mock私有变量的值](https://blog.csdn.net/Mint6/article/details/118229891)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [如何mock当前类的私有方法](https://blog.csdn.net/mofsfely2/article/details/128644239)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值