2011-11-27 67 views
2

Scala伴侶對象經常被建議作爲對象工廠。他們似乎在生產代碼中很好地工作,但插入模擬對象以進行測試呢?伴隨對象不會知道模擬對象,因此不能實例化它。通過擴展工廠特徵將Scala隨播對象用作工廠。解決方案更好

我想要做這樣的事情:

class Foo {} 
object Foo { 
    def create():Foo = new Foo() 
} 

class FooCreator(factory:Foo) { 
    def this() = this(Foo) 
    ... 
    factory.create() 
    ... 
} 

class FooMock extends Foo {} 
object FooMock extends Foo { 
    def create():Foo = new FooMock() 
} 

// in a test 
val fooCreator = new FooCreator(FooMock) 

這不會起作用,因爲同伴對象不能被延長。我不得不創建一個工廠的特質對兩個同伴反對混入:

trait FooFactory { 
    def create():Foo; 
} 

class Foo {} 
object Foo extends FooFactory { 
    def create():Foo = new Foo() 
} 

class FooCreator(factory:FooFactory) { 
    def this() = this(Foo) 
    ... 
    factory.create() 
    ... 
} 

class FooMock extends Foo {} 
object FooMock extends FooFactory { 
    def create():Foo = new FooMock() 
} 

// in a test 
val fooCreator = new FooCreator(FooMock) 

有沒有更好的方式來做到這一點?創建工廠特質只是感覺不對,因爲這是伴侶對象應該擅長的。 (請記住,模擬構件只對測試子系統是已知的,所以我不能通過讓對象Foo創建一個FooMock實例 - 生產代碼中的常見模式)來解決問題。

+0

我認爲,你需要的是**依賴注入**框架/庫/方法 – tenshi

回答

1

你可能想看看ScalaMock,嘲弄的框架斯卡拉可以(除其他事項外)模擬對象創建(編譯器調用)。這正是它打算解決的問題之一。