2015-09-14 23 views
6

Guice as DI sağlayıcısı olan bir Play (v. 2.4) uygulaması üzerinde çalışıyorum. Her şey iyi çalışıyor ancak ScalaTestPlus ile çalışan bir dizi fonksiyonel test var ve test çalışırken bazı bağımlılıkları değiştirmek istiyorum. Testler, REST API'mı kontrol ettikleri için OneServerPerSuite sınıfını genişleterek yazılır.İşlevsel testler için Guice bağlamaları nasıl değiştirebilirim?

Testler sırasında başka bağımlılıklara sahip olmanın bir yolu var mı?

DÜZENLEME: Örnek kod:

Numune denetleyici:

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

Ve modülünde Bağımlılığı tanım:

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

Benim testlerde

bu şekildedir:

class ApiTest extends PlaySpec with OneServerPerSuite { 

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

ProdUserService'un diğer uygulamalarla değiştirilmesini ancak yalnızca testlerde olmasını istiyorum.

+0

Eğer herhangi bir örnek kod var mı? – Kmeixner

+1

Soruyu örnek kodla güncelledim. – walak

cevap

1

Bu yapmalıyım:

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 
     } 
    } 
}