使用嵌套调用模拟传统静态方法

时间:2015-09-11 13:44:22

标签: java junit mockito powermock

如何模拟如下所示的方法:

LoggerUtil.getInstance().getAppLog().info("Some log statement");

这里LoggerUtil以静态方式实例化,尽管记录器通过spring注入此调用。

<bean id="LoggerUtil" class="util.LoggerUtil" factory-method="getInstance">
    <property name="appLog" ref="AppLogger" />
</bean>
<bean id="AppLogger" class="org.apache.log4j.Logger" factory-method="getLogger">
    <constructor-arg value="logging.AppLogger" />
</bean>

我尝试过以下代码,但无济于事:

@Test
public void testLoggerUtil() {

  PowerMockito.mockStatic(LoggerUtil.class);
  LoggerUtil logUtil = mock(LoggerUtil.class);
  Logger logger = mock(Logger.class);

  PowerMockito.when(LoggerUtil.getInstance()).thenReturn(logUtil);
  when(logUtil.getAppLog()).thenReturn(logger);
  Mockito.doNothing().when(logger).info(any(String.class));

  LoggerUtil.getInstance().getAppLog().info("Some log");

}

代码是遗留的,日志语句存在于数千个地方。无法对其进行任何更改。

任何帮助都将受到高度赞赏。在此先感谢。

1 个答案:

答案 0 :(得分:0)

也许值得尝试AspectJ。您可以尝试在测试阶段执行创建方面,找到切入点LoggerUtil.getInstance()并返回一些模拟或测试实现。这样,每次为遗留代码创建测试时,您都不必处理记录器。