如何在Mockito中模拟正在测试的班级中的私人班级成员

时间:2019-03-17 01:26:42

标签: java unit-testing mockito

我有一个遗留类,我添加了一些方法,并且需要创建一些仅测试这4种方法的JUnit测试。被测类有一个参数构造函数,用于初始化字符串。但是,在构造函数中调用一个私有方法,该方法使用属性文件初始化几个私有类和一个数据源。我要测试的方法没有使用任何这些类。

我刚开始编写JUnit测试,不知道如何模拟此私有方法,或者不确定是否可行。
正在测试的类的构造函数是这样的:

public ClassUnderTest(String wlUrl) throws Exception {
try {
    this.url = wlUrl;
    initialize();
} catch (Exception ex) {
    throw ex;
}

} initialize()方法是私有的,它实例化了一些我不想在要测试的方法中使用的私有类。

private void initialize() throws Exception {
    try {
        PropertyManager.getInstance();
        logAdapter = LogAdapter.getInstance(PropertyManager.getProperty("LOG_CONFIG_FILE"));    
        log20 = new ServerLogging20();
        ds = (javax.sql.DataSource) ctx.lookup(PropertyManager.getProperty("DATASOURCE"));
        setInitialContext(url);
    } catch (Exception e) {
        log.error("ERROR instantiating PropertyManager & LogAdapter  - " + e.getMessage());
        throw e;
    }
}

有什么方法可以模拟这个私有方法来测试我编写的方法?

1 个答案:

答案 0 :(得分:0)

Mockito不支持模拟私有方法。
以下是Mockito's FAQ的摘录:

  

为什么Mockito不模拟私有方法?

     

首先,我们并不是在嘲笑私有方法。我们刚刚   不在乎私有方法,因为从   测试,私有方法不存在。这有两个原因   Mockito不会模拟私有方法:

     
      
  1. 这需要对类加载器进行黑客攻击,而这绝不是防弹措施,   更改API(您必须使用自定义测试运行器,为类添加注释,   等等。)。
  2.   
  3. 这很容易解决-只需更改   从私有到受包保护(或受保护)的方法。
  4.   
  5. 这需要   团队花时间实施和维护它。而且它不   给定点(2)和已经实施的事实是有意义的   在不同的工具(powermock)中。
  6.   
  7. 最后...模拟私有方法是   提示面向对象的理解存在问题。   在OO中,您希望对象(或角色)进行协作,而不是方法。忘记   关于Pascal和程序代码。思考对象。
  8.   

如果您真的想模拟私有方法,请查看PowerMock