2011-12-22 425 views
21

據我所知,@VisibleForTesting是不可取的,因爲它只是爲了測試目的而改變一個類的接口。理想情況下,我們應該測試我們實際使用的界面。但是,什麼是一個好的選擇?@VisibleForTesting的替代品

+0

隨意將代碼發佈到[CodeReview.SE](http://codereview.stackexchange.com/)。 – palacsint 2011-12-22 10:34:19

+0

我真的是一個普通的問題,而不是需要重構的特定代碼。 – Thiago 2011-12-22 12:45:40

回答

37

如您所說,您在使用@VisibleForTesting時想要測試不暴露給最終用戶的部分代碼。如果你想測試它,那麼它很可能意味着它很複雜,或者至少不是微不足道的。兩種解決方案將是:

  1. 拆分方法,您將其調用到幾個方法中,以便讓您對沒有一個大方法同時執行一堆內容感到更加舒適。
  2. 看看你是否可以將行爲移動到負責處理它的外部對象。

當東西開始變得複雜時,我喜歡#2,因爲我可以有一個外部對象,我可以測試並確保它可以工作,而無需通過我們的界面公開它。

話雖如此,有些時候這些行爲並不能保證將方法提取到一個新對象中,而只是爲了節省時間而使用@VisibleForTesting。經驗是什麼時候告訴你什麼時候值得做(或不做)。

+12

+1用於移動到外部對象。這是雙贏的情況之一,在這種情況下,編寫好的測試實際上會改進您正在測試的代碼。 – millhouse 2011-12-22 03:28:53

+1

這個答案沒有解決的情況下,當你必須添加額外的修飾符方法到一個類爲了使它可配置爲測試。當您的生產代碼使用@Autowired來連接依賴關係時,尤其是在與依賴關係注入一起使用時,測試代碼需要在各個單元測試的每個測試方法中單獨設置它們,以測試不同的方案。 – 2015-04-02 16:15:02