2017-06-20 50 views
1

在我的代碼中我有一個try-finally方法。我不想最後阻止我的單元測試。我可以嘲笑我的類中的整個finally塊,因爲在我的情況下只是記錄?我正在使用PowerMockito進行單元測試。我們能不能在單元測試中最後阻止

try { 
    String foo = obj.myMethod(); 
} finally { 
    logger.info(obj.webService()); 
} 
+0

爲什麼在測試時記錄一個問題? – alfasin

+1

爲什麼你想嘲笑一個街區。你只能模擬對象而不是塊或循環。 –

+3

爲什麼不只是模擬記錄器? –

回答

2

您寫的類將調用logger.info(obj.webService()),因此您的測試應該執行此操作。

根據測試類是否在測試中運行,讓測試類執行不同的測試並不是一個好主意。所有你可以改變的是它的協作者,通常用模擬替換它們。

在這種情況下,obj是協作者。所以注入obj的模擬。根據測試的意圖,使用默認值可能就足夠了,因此記錄器將記錄null,或者您可能需要指定when以使obj.webService()返回有效的對象,或者您甚至可能要驗證它是否爲調用。

+0

我在做一個假設,但是假設NPE是記錄器iteslf爲空。恰當地嘲笑主要合作者foo非常棒,但沒有解決第二個合作者,記錄者的問題。 –

0

在評論中你聲明你想避免在測試期間調用你的web服務。

我不想從我的web服務中返回任何值。

我認爲你,如果你的應用程序的日誌級別設置爲警告或更高也不想這樣。 (我在這裏假設Java默認日誌)

然後將溶液簡單:用日誌的形式,這需要SupplierLogger.info(Supplier<String> msgSupplier)

所以,你的finally塊會變成:

} finally { 
    logger.info(() -> obj.webService()); 
} 

然後,對於您的測試或針對此問題的生產而言,只是將您的日誌記錄設置爲Level.NONE,並且供應商永遠不會執行。

相關問題