问题描述
我有一个使用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