用嵌套调用模拟遗留Static方法



如何模拟如下方法:

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");
}

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

任何帮助都将非常感激。

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

相关内容

  • 没有找到相关文章

最新更新