java - 如何使用 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;
}
}
有没有办法模拟这个私有方法来测试我写的方法?
解决方案
Mockito 不支持模拟私有方法。以下是Mockito 常见问题解答
的摘录:
为什么 Mockito 不模拟私有方法?
首先,我们对模拟私有方法并不教条。我们只是不关心私有方法,因为从测试的角度来看,私有方法不存在。以下是 Mockito 不模拟私有方法的几个原因:
- 它需要对永远不会防弹的类加载器进行黑客攻击,并且它会更改 API(您必须使用自定义测试运行器、注释类等)。
- 这很容易解决 - 只需将方法的可见性从私有更改为包保护(或受保护)。
- 它需要团队花时间实施和维护它。鉴于第 (2) 点以及它已经在不同的工具 (powermock) 中实现的事实,这没有任何意义。
- 最后... 模拟私有方法暗示了面向对象的理解有问题。在 OO 中,您希望对象(或角色)协作,而不是方法。忘记帕斯卡和程序代码。在对象中思考。
如果您真的想模拟私有方法,请查看PowerMock。
推荐阅读
- python-3.x - 请求后重试机制问题
- php - CakePHP4:连接表上的连接位置未按预期工作
- javascript - 将纯文本转换为具有键值对的对象
- html - Typo3 中的 iframe 未加载
- java - Java 程序在从 main() 提取的变量之间输出空格,这很好。但是我想删除尾随空格
- c - 为什么即使变量没有改变 const 也不起作用?
- extjs - ExtJs 6 或 7 焦点树列表项进入视图
- email - 使用 Zoho Deluge 将 SMS 从 Twilio 转发到电子邮件
- python - 如何在另一个函数中使用一个函数中的值
- javascript - 如何按顺序获取网址?