【问题标题】:How to use Mockito or PowerMock to change org.slf4j.Logger to print to console如何使用 Mockito 或 PowerMock 将 org.slf4j.Logger 更改为打印到控制台
【发布时间】:2020-08-24 18:50:18
【问题描述】:

我有一个使用 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()

【问题讨论】:

  • 创建自己的 claas 来实现 Logger?
  • 注入记录器,不要静态构造它。像 PowerMock 这样的工具只能作为最后的手段使用,因为它们使用字节码操作。此外,您可以重新配置记录器以进行测试。

标签: java junit mockito powermock


【解决方案1】:

老实说,您的方法在我看来有点奇怪:我宁愿为测试定义单独的日志配置。无论如何,如果你有充分的理由来实现你想要达到的目标,那么你可以这样做:

@Before
public void setUp() {
    MyNewClass.setLogger(mockedLogger);
    Mockito.doAnswer(invocation -> {
        System.out.println((String) invocation.getArgument(0));
        return null;
    }).when(mockedLogger).info(anyString());
}

使用 PowerMock,您可以通过模拟 LoggerFactory 来摆脱 MyNewClass 中的记录器设置器:

@RunWith(PowerMockRunner.class)
@PrepareForTest(LoggerFactory.class)
public class MyNewClassTest {

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

    @Before
    public void setUp() {
        PowerMockito.mockStatic(LoggerFactory.class);
        PowerMockito.when(LoggerFactory.getLogger(any(Class.class))).thenReturn(mockedLogger);
        Mockito.doAnswer(invocation -> {
            System.out.println((String) invocation.getArgument(0));
            return null;
        }).when(mockedLogger).info(anyString());
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 2011-01-30
    相关资源
    最近更新 更多