我有一个旧类,我添加了一些方法,需要创建一些仅测试这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不模拟私人方法:
- 它需要从来没有保证的classloader的黑客攻击者 更改API(您必须使用自定义测试跑者,注释类, ETC。)。
- 四处易解决非常容易 - 只需更改可见度 从私人到包裹保护(或受保护)的方法。
- 它需要 团队花时间实施&维护它。而且不是 给定点(2)和已经实施的事实是有意义的 在不同的工具(PowerMock)中。
- 最后...嘲笑私人方法是一个 暗示面向对象的理解有问题。 在OO中,您需要对象(或角色)来协作,而不是方法。忘记 关于Pascal&程序代码。在对象中思考。
如果您真的想模拟私人方法,请查看PowerMock。