鑑於以下FooService
:依賴注入`trait`
scala> trait FooService {
| def go: Int
| }
defined trait FooService
還有一個MainService
,它代表一個主要方法。
scala> trait MainService extends FooService {
| def f = go + 42
| }
defined trait MainService
FooService
可以有一個假的(測試)和一個真正的實現(打DB爲例):
scala> object FakeService extends FooService {
| def go = 10
| }
defined object FakeService
scala> object RealService extends FooService {
| def go = 55 // in reality, let's say it hit the DB and got a value
| }
defined object RealService
在我看來,添加一個「亞軍」類/特性,即運行sbt run
會導致該類的執行,將是可行的。它看起來像:
scala> class Main extends MainService {
| override def go = RealService.go
| }
defined class Main
而且我可以定義一個測試過:
scala> class Test extends MainService {
| override def go = FakeService.go
| }
defined class Test
我不敢肯定這是定義一個真正與測試MainService
的慣用方式。請告訴我。
您可以從MainService擴展FakeService/RealService並使用它們。或者你可以製作FakeService/RealService特性並將它們混合到Main/Test。 –
查看Google Guice的簡單易用的DI解決方案。我發現這是很好的開始。 –