No implementation for play.api.db.slick.DatabaseConfigProvider when trying to create an integration test for a Controller

584 views
Skip to first unread message

Felipe Gutierrez

unread,
Jan 8, 2018, 2:23:26 AM1/8/18
to Play Framework
Hi,

I am trying since 2 days ago create an integration test for my routes using Play framework. I could create on for the HomeController that doesn't have any parameter on the constructor. Now I have my second Controller: RackController

import javax.inject._

class RackController @Inject()(cc: ControllerComponents, rackRepository: RackRepository, gpuRepository: GpuRepository) extends AbstractController(cc) with I18nSupport {

and I created this integration test:

import models.{GpuRepository, RackRepository}
import org.scalatestplus.play._
import org.scalatestplus.play.guice._
import play.api.db.evolutions.Evolutions
import play.api.db.{Database, Databases}
import play.api.inject.bind
import play.api.inject.guice.GuiceInjectorBuilder
import play.api.test.Helpers._
import play.api.test._


class RackControllerSpec extends PlaySpec with GuiceOneAppPerTest with Injecting {


  val database
= Databases(
    driver
= "org.sqlite.JDBC",
    url
= "jdbc:sqlite:development.db",
    name
= "default",
    config
= Map(
     
"username" -> "",
     
"password" -> ""
   
)
 
)
  val guice
= new GuiceInjectorBuilder()
   
.overrides(bind[Database].toInstance(database))
   
.injector()
  val rack
= guice.instanceOf[RackRepository]
  val gpu
= guice.instanceOf[GpuRepository]


 
def beforeAll() = Evolutions.applyEvolutions(database)


 
def afterAll() = {
   
// Evolutions.cleanupEvolutions(database)
    database
.shutdown()
 
}


 
"RackController GET" should {
   
"render the rack page from a new instance of controller" in {
      val controller
= new RackController(stubControllerComponents(), rack, gpu)
      val result
= controller.all().apply(FakeRequest(GET, "/api/all"))


      status
(result) mustBe OK
      contentType
(result) mustBe Some("application/json")
      contentAsString
(result) must include("{ \"profitPerGpu\" }")
   
}
 
}
}

I have this error saying the no implementations of play.api.db.slick.DatabaseConfigProvider was found. I already tried to remove jdbc from my build.sbt but it didnt work.
Does anyone have an idea?

Thanks, Felipe


[info] RackControllerSpec:
[info] controllers.RackControllerSpec *** ABORTED ***
[info]   com.google.inject.ConfigurationException: Guice configuration errors:
[info]
[info] 1) No implementation for play.api.db.slick.DatabaseConfigProvider was bound.
[info]   while locating play.api.db.slick.DatabaseConfigProvider
[info]     for the 1st parameter of models.RackRepository.<init>(RackRepository.scala:13)
[info]   while locating models.RackRepository
[info]
[info] 2) No implementation for scala.concurrent.ExecutionContext was bound.
[info]   while locating scala.concurrent.ExecutionContext
[info]     for the 2nd parameter of models.RackRepository.<init>(RackRepository.scala:13)
[info]   while locating models.RackRepository
[info]
[info] 2 errors
[info]   at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1045)
[info]   at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1004)
[info]   at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1054)
[info]   at play.api.inject.guice.GuiceInjector.instanceOf(GuiceInjectorBuilder.scala:409)
[info]   at play.api.inject.guice.GuiceInjector.instanceOf(GuiceInjectorBuilder.scala:404)
[info]   at play.api.inject.ContextClassLoaderInjector.$anonfun$instanceOf$2(Injector.scala:117)
[info]   at play.api.inject.ContextClassLoaderInjector.withContext(Injector.scala:126)
[info]   at play.api.inject.ContextClassLoaderInjector.instanceOf(Injector.scala:117)
[info]   at controllers.RackControllerSpec.<init>(RackControllerSpec.scala:28)
[info]   at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)








Reply all
Reply to author
Forward
0 new messages