我有一个遗留类,我添加了一些方法,需要创建一些JUnit测试,只测试这4个方法。被测试的类有一个初始化字符串的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's FAQ的摘录:
为什么Mockito不会模仿私有方法?
首先,我们对于嘲弄私人方法不是教条主义。我们不关心私有方法,因为从测试的角度来看,私有方法不存在。以下是Mockito不会模仿私有方法的几个原因:
- 它需要对类加载器进行黑客攻击,这种类加载器绝不是防弹的,它会更改API(您必须使用自定义测试运行器,注释类等)。
- 这很容易解决 - 只需将方法的可见性从私有更改为受包保护(或受保护)。
- 它要求团队花时间实施和维护它。鉴于第(2)点以及已经在不同工具(powermock)中实现的事实,它没有意义。
- 最后......模拟私有方法暗示了面向对象的理解存在问题。在OO中,您希望对象(或角色)进行协作,而不是方法。忘记pascal和程序代码。在对象中思考。
如果你真的想模仿私有方法,请看PowerMock。