2014-04-07 69 views
0

我正在做一個網絡應用程序ScalaAkka演員,我在tests有一些麻煩。單元測試AKKA actors

對我來說,我需要去品味誰與數據庫會談演員。要進行單元測試,我想使用假數據庫,但是我無法用我想要的假對象替換新的數據庫。

讓我們來看看一些代碼:

Class MyActor extends Actor { 
    val database = new Database() 

    def receive = { ... } 
} 

而且在我想注入FakeDatabase對象,而不是數據庫的測試。我一直在尋找互聯網,但我發現的最好的是:

  • 將一個參數添加到構造函數。
  • 轉換的val數據庫到var所以在測試中我可以訪問由基礎屬性和替換它。

這兩種解決方案解決這個問題,但都非常髒。

不是解決問題的更好的辦法?

謝謝!

+2

我不會稱之爲「添加參數構造函數」髒。如果你考慮語義:可以演員沒有數據庫的功能?可能不會,所以構造函數對它來說是一個非常好的地方,因爲你明確指出要創建actor,它需要傳遞一個數據庫。 –

+0

我不是專家,但在你的測試中,你可以覆蓋數據庫是這樣的:new MyActor {override val database = new FakeDatabase} – user24601

+0

我認爲它可以工作,這是最簡單的解決方案。謝謝 – mtrebi

回答

0

此相呼應的建議,我也不會調用構造函數髒注入數據庫。它可能有很多好處,包括從特定數據庫實例中解耦actor動作。

但是如果你知道只有一個數據庫,你將永遠用你的產品代碼,然後把它定義包級別的訪問構造函數和一個同伴對象沒有默認參數返回一個道具對象。

舉例如下:

object MyActor { 

    def props() : Props = Props(new MyActor(new Database())) 

} 

class MyActor private[package](database : IDatabase) extends Actor { 

    def receive = { ... } 
} 

在這種情況下,你仍然可以在你的測試情況下注入測試數據庫(給予相同的封裝結構),但阻止代碼的用戶意想不到的實例MyActor數據庫實例。

+0

我很確定我們會有多個數據庫。我也試圖避免在我的代碼中的其他原因構造函數中的參數,我沒有在這裏評論,以簡化問題。無論如何,我會看看。謝謝@Norbert – mtrebi