如何模拟如下所示的方法:
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");
}
代码是遗留的,日志语句存在于数千个地方。无法对其进行任何更改。
任何帮助都将受到高度赞赏。在此先感谢。
答案 0 :(得分:0)
也许值得尝试AspectJ。您可以尝试在测试阶段执行创建方面,找到切入点LoggerUtil.getInstance()并返回一些模拟或测试实现。这样,每次为遗留代码创建测试时,您都不必处理记录器。