이것은 Guice를 소개하려고 시도한 Play 2.3 애플리케이션에 관한 것입니다. 내가 Guicify하려면 다음 레거시 코드를 가지고 내가슬릭 데이터베이스 서비스 용 재생 애플리케이션 삽입
class DatabaseService {
def db: Database = DB(play.api.Play.current)
//More code below.
}
이 클래스는 테스트 대상 클래스에 주입이 지점에 도달, com.TestA을 말한다. 수정 된 OneAppPerTest
설정을 사용하여 테스트 케이스를 실행하면 다음 종류의 ProvisionExceptions가 표시됩니다.
Error injecting constructor, java.lang.RuntimeException: There is no started application
play.api.Play.current
을 사용하고 있기 때문에 사용하고 있습니까? 이 문제를 어떻게 해결합니까?
는 정보 변형 OneAppPerTest 재정의 추가, Guice는 워크
protected def globalSettings = {
new TestGlobalSettings {
val injector = Guice.createInjector(overriddenModules: _*)
override def getControllerInstance[A](controllerClass: Class[A]): A = {
injector.getInstance(controllerClass)
}
override def getInjector = {
injector
}
}
}
내에 도입 additionalConfiguration
가 실제 테스트 및 globalSettings
의해 무시 될 수
override def newAppForTest(testData: TestData): FakeApplication = {
new FakeApplication(
additionalConfiguration = additionalConfiguration,
withGlobal = Some(globalSettings)
)
}
는 다음 논리를 사용 비슷한 설정으로 완벽하게 작동하는 다른 테스트 케이스가 있습니다. mock을 주입하고 수업을 테스트 할 수 있습니다. 그러나이 DatabaseService 클래스를 사용하는 모든 테스트에는 오류가 발생합니다.
'DatabaseService'가 삽입되면 왜'DB'도 삽입하지 않을까요? – rethab
아직 시도해보십시오. 나는 이것이'Application'도 주입되어야한다는 가정하에있었습니다. 그러나 그것은 암묵적인 매개 변수로 밝혀졌습니다. 나는 당신이 언급 한 것을 시도하고 당신에게 돌아갈 것입니다. – Serendipity
@rethab DB는 주사 가능한 속성이 아닙니다. 그것은 데이터베이스를 만드는 더 많은 방법입니다. 데이터베이스는 인수가없는 생성자가 없기 때문에 쉽게 삽입 할 수 없습니다. – Serendipity