如何模拟如下方法:
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。