2015-09-11 17 views
0

如何嘲笑类似下面的方法:模拟传统的静态方法与嵌套调用

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

究竟发生了什么问题? – durron597

+0

我在调用静态模拟时遇到异常。 –

+0

什么例外?请用更多信息[编辑]你的问题。 – durron597

回答

0

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

相关问题