2017-09-12 1 views
4

설명서는 종속성 삽입에 대해 설명하지만 실제로 수행 방법을 보여주지는 않습니다.ktor 응용 프로그램에서 종속성을 주입하는 방법

문서뿐만 아니라 완성과 장소 홀더의 무리가되지 않습니다 http://ktor.io/getting-started.html

내가 그것 (내 종속되는) 매개 변수를 허용하는 방식으로 내 주요 기능을 만들려고을하지만 테스트에 실패 옆에 withTestApplication라고 전화하면됩니다. 응용 프로그램 코드를 살펴본 후 응용 프로그램에서 구성 개체를 허용한다는 것을 알았지 만 구성 개체를 변경하여 내부의 일부 종속성을 주입 할 수있는 방법을 모를 수 있습니다. withTestApplication를 사용하여 테스트 코드에서

package org.jetbrains.ktor.application 

/** 
* Represents configured and running web application, capable of handling requests 
*/ 
class Application(val environment: ApplicationEnvironment) : ApplicationCallPipeline() { 
    /** 
    * Called by host when [Application] is terminated 
    */ 
    fun dispose() { 
     uninstallAllFeatures() 
    } 
} 

/** 
* Convenience property to access log from application 
*/ 
val Application.log get() = environment.log 

나는 아래에 비슷한 있습니다 : (. 내가 조롱하고 주입해야하는 매개 변수) 내가 매개 변수 myMain를 호출하는 경우

@Test 
internal fun myTest() = withTestApplication (Application::myMain) 

은 위의 withTestApplication이 실패를

은 다음과 같습니다 업데이트

그 요청 처리, 그 밖의 다른 웹 서비스에 연결하고 일부 요청을 않습니다 의존성 클래스를 사용하고 있습니다, 나는 내 테스트에서 이렇게 주입 할 수있는 방법이 필요합니다 내가 그것을 스텁/모의 그것의 행동을 변경할 수 있습니다 테스트 케이스에 따라

답변

4

Ktor에는 기본 제공되는 종속성 주입 메커니즘이 없습니다. DI를 사용해야하는 경우 예를 들어 Guice와 같이 원하는 프레임 워크를 사용해야합니다.

fun Application.module() { 
    Guice.createInjector(MainModule(this)) 
} 

// Main module, binds application and routes 
class MainModule(private val application: Application) : AbstractModule() { 
    override fun configure() { 
     bind(Application::class.java).toInstance(application) 
     ... other bindings ... 
    } 
} 

이 방법을 사용하면 애플리케이션 구성을 Guice에 위임하고 다른 애플리케이션과 마찬가지로 빌드 할 수 있습니다. 예 : 이 같은 응용 프로그램의 다른 부분을 구성 할 수 있습니다 그것을 바인드

class Hello @Inject constructor(application: Application) { 
    init { 
    application.routing { 
     get("/") { 
      call.respondText("Hello") 
     } 
    } 
    } 
} 

다음을 메인 모듈 : 다른 서비스가 쿼리 없을 것 때문에 Guice 열망을 만들 수 있도록

bind(Hello::class.java).asEagerSingleton() 

asEagerSingleton이 필요 그것.

+1

내 경우에는 다른 서비스와 상호 작용하는 클래스 의존성이 있습니다. 어떻게 그 중 하나를 주입합니까 (그래서 내 테스트를 작성할 때 종속성을 모방하고 모의 인스턴스를 전달합니다. 진짜 하나) –

관련 문제