目標是對一個硬編碼的log4j Appender進行功能測試,該測試擴展了RollingFileAppender,我可以在其中重現使用MyAppender寫入同一文件的log4j記錄器的多個實例。我的方法是攔截由log4j的FileAppender類創建的FileOutputStream的創建。如何通過Log4j創建Powermockito模擬java.io.FileOutputStream?
但匿名答案中的System.out調用永遠不會被調用。當我在FileOutputStream構造函數上放置一個斷點時,我發現它正在按照我的預期完全創建,並使用下面指定的參數。當我在寫入方法上放置一個斷點時,它是被調用的三個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
}
P.S.即使我沒有粘貼該部分,我仍在使用PowerMockRunner。
功能測試是在多個記錄器從一個容器中的父容器繼承時重現日誌重複。這是log4j的誤解,首先導致了重複,但通過嘗試編寫測試,我明白log4j現在好多了。 – bickelj 2013-03-26 14:11:22