如何使用Mockito或PowerMock将org.slf4j.Logger更改为打印到控制台

问题描述

我有一个使用Mockito模拟的类。原始的类非常简单,如下所示。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyNewClass{
    private static Logger logger = LoggerFactory.getLogger(MyNewClass.class);
    
    /**
     * Only for unit/integration test,otherwise no need to use this method.
     */
    protected static void setLogger(Logger logger) {
        MyNewClass.logger = logger;
    }

}

方法logger.info("SomeString")将被打印到文件,因为它已配置用于生产。 在我的测试课程中,如何改为打印到控制台?我目前在Eclipse中。

public class MyNewClasstest{
    private static Logger mockedLogger = Mockito.mock(Logger.class);

    @Before
    public void setUp() throws Exception {
        MyNewClass.setLogger(mockedLogger);
        // Todo how to print to console instead of file.
    }
}

然后,如何使用mockedLogger.info("SomeString")覆盖System.out.println()并打印到控制台上

解决方法

老实说,您的方法在我看来有点奇怪:我宁愿为测试定义单独的日志记录配置。无论如何,如果您有充分的理由要实现目标,请按以下步骤操作:

# from a merge commit M :
git log M^..M

使用PowerMock,您可以通过嘲笑@Before public void setUp() { MyNewClass.setLogger(mockedLogger); Mockito.doAnswer(invocation -> { System.out.println((String) invocation.getArgument(0)); return null; }).when(mockedLogger).info(anyString()); } 来摆脱MyNewClass中的记录器设置程序:

LoggerFactory