2013-03-12 59 views
0

目標是對一個硬編碼的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。

回答

0

沒有看到您的應用程序代碼,很難確切地確定要建議的內容。但是,你可以嘲笑log4j Logger?只需注入Logger的模擬並驗證正確的日誌方法正在被調用。

如果您嘲笑FileOutputStream,那麼您實際上正在測試log4j以及測試您自己的應用程序代碼。除非你是開發團隊的log4j,否則你可能不想這樣做。

+0

功能測試是在多個記錄器從一個容器中的父容器繼承時重現日誌重複。這是log4j的誤解,首先導致了重複,但通過嘗試編寫測試,我明白log4j現在好多了。 – bickelj 2013-03-26 14:11:22

0

答案:消除ServletUnit/HttpUnit的使用,因爲它們阻礙了它。我不知道它是一些東西還是兩者的靜態初始化或私有範圍,但是當我擺脫了假容器並僅實例化了我需要的裸類時它就工作了。

相關問題