2017-03-07 7 views
0

이것은 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 클래스를 사용하는 모든 테스트에는 오류가 발생합니다.

+0

'DatabaseService'가 삽입되면 왜'DB'도 삽입하지 않을까요? – rethab

+0

아직 시도해보십시오. 나는 이것이'Application'도 주입되어야한다는 가정하에있었습니다. 그러나 그것은 암묵적인 매개 변수로 밝혀졌습니다. 나는 당신이 언급 한 것을 시도하고 당신에게 돌아갈 것입니다. – Serendipity

+0

@rethab DB는 주사 가능한 속성이 아닙니다. 그것은 데이터베이스를 만드는 더 많은 방법입니다. 데이터베이스는 인수가없는 생성자가 없기 때문에 쉽게 삽입 할 수 없습니다. – Serendipity

답변

0

문제는 Guice가 개체를 만드는 방법과 관련이 있습니다. 여기 DatabaseService는 현재 응용 프로그램, 현재 구성에 액세스 할 수 있습니다. 그러나 Global.scala에서는 'onStart'가 실제로 호출되기 전에 주입했습니다. 이것은 응용 프로그램이 제대로 초기화되기 전에 응용 프로그램에 액세스하려고한다는 것을 의미합니다.

테스트 클래스에서 DatabaseService 주입을 사용하면 오류가 발생하지 않습니다. lazy