2011-06-15 91 views
3

您會如何比較Scala的對象可測試性與Java中的靜態測試?任何陷阱和陷阱?測試Scala對象

謝謝。

回答

9

與Java中的靜態相同 - 爲了測試目的,對象引用很難交換,因此除了無副作用的無狀態實用方法(例如Math.min,Math.max)之外,您通常希望避免它們。就像Java靜態一樣,持有狀態的對象使得測試特別困難。

儘管Scala對象比Java靜態有一個優點,您可以讓對象擴展一些超類型並通過該接口引用。然後,你可以注入該對象到您的客戶端類的構造函數,所以你的客戶得到更多的可測試:

object MyRunnable extends Runnable { 
    def run() { } 
} 

class Client(r: Runnable) { 
    // .. 
} 

new Client(MyRunnable) 
new Client(mock[Runnable]) // you can substitute the object with a mock for tests 

用普通的Java靜態的,那是不可能的。你可以用Java中的單例做類似的事情(與Scala對象相似)。

3

通常,使用'object'類聲明的Scala單例實例比Java靜態方法更適合測試,主要是因爲它們能夠實現特徵並擴展其他類,因此適合典型的面向對象測試範例。

現在,如果您碰巧在單例對象中做了一些不幸的事情,比如存儲可變狀態,您將遇到與測試Java單例時相同的各種問題。當然,有一個簡單的解決方案:永遠不要在對象的主體中使用「var」。這是「絕不使用var,period」的高級建議的一個微不足道的專業化。