2017-09-12 50 views
4

文檔討論了依賴注入,但並未真正顯示它是如何完成的。如何在ktor中注入依賴關係應用

文檔未完成以及和有一堆佔位: http://ktor.io/getting-started.html

我想在一個方法來創建我的主要功能,它接受的參數(這是我的依賴),但未能上試當我打電話給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 

在使用withTestApplication測試代碼我有類似如下的內容:(我需要模擬和注入參數)

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

如果我叫myMain與參數上面withTestApplication會失敗

更新:

的是起訴是,在我的請求處理中,我使用了一個依賴類,連接到外部其他Web服務並執行一些請求,我需要一種方法能夠在我的測試中注入它,因此可以對其進行存根/模擬並更改其行爲基於我的測試案例。

回答

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

然後將它綁定:你可以編寫應用程序的不同部分這樣

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

asEagerSingleton需要讓吉斯將急切地創造它,因爲沒有其他的服務將查詢它。

+1

謝謝你的迴應,在我的情況下,我確實有一個與其他服務交互的類依賴關係,我如何注入那個(所以當我編寫我的測試時,我只是依賴/傳遞一個模擬實例而不是真正的) –

相關問題