鉴于以下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解决方案。我发现这是很好的开始。 –