目标是对扩展 RollingFileAppender 的硬编码 log4j Appender 进行功能测试,我可以在其中重现使用 MyAppender 写入同一文件的 log4j 记录器的多个实例。我的方法是拦截由 log4j 的 FileAppender 类创建的 FileOutputStream 的创建。
但是匿名 Answers 中的 System.out 调用永远不会被调用。当我在 FileOutputStream 构造函数上放置一个断点时,我看到它的创建完全符合我的预期,我在下面指定了参数。当我在 write 方法上设置断点时,调用的是三个 arg 版本。
我正在使用 Meterware 的 ServletUnit 来模拟在容器中。MyLogAppender.logFile 是一个常量。
我错过了什么?
@Test
@PrepareForTest({MyLogAppender.class})
public void MyLogMessageGetsWritten() throws SAXException, IOException, Exception {
//...
// INTERCEPT LOG HERE SOMEHOW
PowerMockito.mockStatic(FileOutputStream.class);
FileOutputStream mockFos = PowerMockito.mock(FileOutputStream.class);
PowerMockito.whenNew(FileOutputStream.class).withParameterTypes(String.class, boolean.class).withArguments(MyLogAppender.logFile, true).thenReturn(mockFos);
//...
PowerMockito.doAnswer(new Answer() {
public Object answer(InvocationOnMock invocation) {
Object[] args = invocation.getArguments();
Object mock = invocation.getMock();
System.out.println("write(byte[], int, int) Called with " + args);
return args;
}
}).when(mockFos).write(any(byte[].class), anyInt(), anyInt());
//...
// ASSERT LOG SUCCESS HERE
}
PS 即使我没有粘贴那部分,我也正在使用 PowerMockRunner 运行。