2015-09-14 29 views
6

Pracuję nad aplikacją Play (wersja 2.4) z Guice jako dostawcą DI. Wszystko działa dobrze, ale mam zestaw testów funkcjonalnych uruchomionych za pomocą ScalaTestPlus i chciałbym zastąpić niektóre zależności, gdy test jest uruchomiony. Testy są pisane przez rozszerzenie klasy OneServerPerSuite podczas sprawdzania mojego interfejsu REST API.Jak zmienić wiązania Guice na testy funkcjonalne?

Czy istnieje sposób na inne zależności podczas testów?

EDIT: Przykładowy kod:

kontroler próbki:

class UserController @Inject()(userService: UserService) extends AbstractController { ... } 

I dependecy definicja w module:

bind(classOf[UserService]) to (classOf[ProdUserService]) 

moich testów są tak:

class ApiTest extends PlaySpec with OneServerPerSuite { 

    "User API should" must { 
     "get User's data" in { 
      (...) //calling to an endpoint and verifying response 
     } 
    } 
} 

Chciałbym zastąpić ProdUserService inną implementacją, ale tylko w testach.

+0

Czy masz przykładowy kod? – Kmeixner

+1

Zaktualizowałem pytanie za pomocą przykładowego kodu. – walak

Odpowiedz

1

ten powinien zrobić:

import play.api.test._ 
import play.api.test.Helpers._ 
import play.api.inject.bind 
import play.api.Application 
import play.api.inject.guice.GuiceApplicationBuilder 
import database.AccountDAO 
import play.api.Configuration 
import play.api.Mode 

class ApiTest extends PlaySpec with OneServerPerSuite { 

def app = new GuiceApplicationBuilder() // you create your app 
     .configure(
      Configuration.from(
      Map(// a custom configuration for your tests only 
       "slick.dbs.default.driver" -> "slick.driver.H2Driver$", 
       "slick.dbs.default.db.driver" -> "org.h2.Driver", 
       "slick.dbs.default.db.connectionPool" -> "disabled", 
       "slick.dbs.default.db.keepAliveConnection" -> "true", 
       "slick.dbs.default.db.url" -> "jdbc:h2:mem:test", 
       "slick.dbs.default.db.user" -> "sa", 
       "slick.dbs.default.db.password" -> ""))) 
     .bindings(bind[UserService].to[UserServiceImpl]) // here you can define your bindings for an actual implementation (note the use of square brackets) 
     .in(Mode.Test) 
     .build() 


    "User API should" must { 
     "get User's data" in new WithApplication(app) { 
      // if you want to get the controller with everything injected 
      val app2controller = Application.instanceCache[controllers.UserController] 
      val userController = app2controller(app) // with this you get the controller with the service injected 

      (...) //calling to an endpoint and verifying response 
     } 
    } 
}