loicdescotte
10/24/2014 - 7:53 AM

ConstructorDI.scala

class PrintService {
  def print = println("I'm a real service")
}

trait Services {
  val printService = new PrintService()
  // put your other services here
}

//for example, a Play controller
class App (deps: Services) /*extends Controller*/ {
  import deps._
  def run = printService.print
}

// In Scala singletons (objects) can be parameterized, so no need for DI framework or container
object DependenciesModule extends Services //global object for your app or controller
object ServicesApp extends App(DependenciesModule)

ServicesApp.run //services

//testing
val printServiceMock = new PrintService { //or use Mockito
 override def print = println("I'm a mock")
}

object MockServices extends Services {
  override val printService = printServiceMock
}

object FakeServicesApp extends App(MockServices) 

FakeServicesApp.run // "I'm a mock"