2012-04-20 110 views
1

我正在使用jmock(也不是我的選擇,沒有什麼我可以改變的)關於遺留代碼和編寫一些junit測試(我知道,錯誤的順序,沒關係)和我有班級做了一些精心設計的日誌記錄,一般來說和Strings混淆了。我們正在使用log4j進行日誌記錄,我想測試這些記錄的消息。我想過嘲笑Logger類,但我不知道該怎麼做。使用jmock嘲笑Logger.getLogger()

由於平時我們已經記錄儀做過這樣的:

private static final Logger LOG = Logger.getLogger(SomeClass.class); 

沒有人有任何想法如何嘲笑方法.getLogger(類)或任何其他的想法如何檢查究竟已經登錄了什麼?

回答

3

您可以編寫自己的appender並將所有輸出重定向到它。

+0

哈!我甚至在幾個月前就這樣做了,但忘記了它。這就是我要做的,謝謝 – Edheene 2012-04-20 08:01:52

3

如果你真的認爲你需要這樣做,那麼你需要看看PowerMock。更具體地說,它是mock static methods的能力。 PowerMock與EasyMock和Mockito集成在一起,但是如果你必須堅持這一點,一些尋找可能會導致你找到一個JMock集成。

話雖如此,我認爲,設置測試框架,這樣好聽的記錄,而不會影響你的測試,確保你的測試取決於記錄的內容是一個更好的辦法。我曾經不得不維護一些單元測試來檢查記錄的內容,它們是我見過的最脆弱和無用的單元測試。我一有時間就可以重寫它們。

+1

+1我也不得不保留那些嘲笑記錄器的測試。完全瘋狂。 – artbristol 2012-04-20 07:19:40

+0

不得不承認,我的「重寫」中有大約80%是按下刪除按鈕;-) – Jon 2012-04-20 07:43:32

+0

但是這意味着改變測試類,我不應該這樣做(當然,如果我發現任何錯誤除外)。我對這種情況也不高興,但我現在沒有辦法做到這一點,或許在將來。無論如何感謝 – Edheene 2012-04-20 08:01:08

0

我發現的最簡單的方法是使用JMockit中的模擬log4j對象。

你只需要在註釋

@UsingMocksAndStubs(Log4jMocks.class) 

添加到您的測試類和測試儀類感動了所有的代碼將使用一個模擬Logger對象。

this

但是這不會登錄的消息。你可以擺脫處理靜態對象的麻煩。