如何測試一個 Private 的方法?

Private 方法真的需要測試嗎?

這樣的討論通常都是兩邊都有道理, 兩派的意見分別為:

  • Private 方法必然是很單純,所以應該是簡單到不能出錯,所以 不用測?
  • Private 方法有時候會有一些複雜度,所以還是需要測試。

我個人的意見是我認為 Private method 的粒度一定是相對來說比較小的,可以確保小範圍的測試是正確的,何樂不為?

Private 方法只能在自身 Class 讀取,該如何測試?

回顧 Java 的 Access Level 看下表最為簡單清楚,

ModifierClassPackageSubclassWorld
publicYYYY
protectedYYYN
no modifierYYNN
privateYNNN
可以透過 No Modifier 的特性,有些書本上會寫這是 default 或是 package level private 都是在指同一件事,就是在 Access Level 的地方留空,也就是一個 method 會從 private void hello() 變成 void hello()。這樣的好處是只要透過一樣的 Package path ,就可以讀取到 package level private 的方法。

但這樣的缺點的就是在語意和概念上,就是一個 private method 但我們在 code 的呈現上就會懷疑這個 default level 的 method 是不是少加了 private

VisibleForTesting Annotation 登場

在上面可能產生程式碼語意上的表達不清楚,於是就有了 @VisibleForTesting 來協助解決問題,而方法就會長得像:

1
2
3
4
@VisiableForTesting
int add(int a , int b) {
return a + b;
}

盡管看起來有一點怪,但讀程式的人就可以了解,Access Level 被去掉的原因,可能是因為測試的關係,就不會擅自去加 private 導致測試無法正常運作。