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實例 - 生產代碼中的常見模式)來解決問題。
我認爲,你需要的是**依賴注入**框架/庫/方法 – tenshi