如何使用 Mockito 模拟正在测试的类中的私有类成员

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


我是编写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;

    }

}

有没有办法模拟这个私有方法来测试我写的方法?


开满天机
浏览 219回答 1
1回答

慕神8447489

Mockito不支持模拟私有方法。以下是Mockito的常见问题解答摘录:为什么Mockito不嘲笑私有方法?首先,我们并不教条地嘲笑私人方法。我们只是不关心私有方法,因为从测试的角度来看,私有方法并不存在。以下是Mockito不嘲笑私有方法的几个原因:它需要对永远不会防弹的类加载器进行黑客攻击,并且它会更改API(您必须使用自定义测试运行程序,注释类等)。它很容易解决 - 只需将方法的可见性从私有更改为受包保护(或受保护)即可。它需要团队花时间实施和维护它。鉴于第(2)点以及它已经在不同工具(powermock)中实现的事实,这是没有意义的。最后。。。嘲笑私有方法暗示了面向对象的理解存在问题。在OO中,您希望对象(或角色)进行协作,而不是方法。忘掉 pascal 和程序代码吧。在物体中思考。如果你真的想嘲笑私有方法,看看PowerMock。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java