Dagger Inject用于集成测试

时间:2018-07-25 10:56:43

标签: android testing integration dagger

到目前为止,在Dagger 2.11之前,我已经能够构造TestComponent和Modules以便将关键组件注入集成测试中。这对于Api测试和具有大量组件需求的对象非常有用

通常,我会有这样的代码:-

class SpotifyApiTest  {

    lateinit var spotifyApi : SpotifyApi
        @Inject set
    lateinit var spotifyHelper : SpotifyIOHelper
        @Inject set

@Before
fun setup() {
    var context = InstrumentationRegistry.getInstrumentation().context

    val testAppComponent = DaggerSpotifyTestComponent.builder()
            .spotifyApiModule(SpotifyApiModule(context))
            .build()
    testAppComponent.inject(this)

}

@Test
  ......
}

N/B remember to add the following to your gradle build file

kaptAndroidTest "com.google.dagger:dagger-compiler:$daggerVersion"

此方法在Dagger 2.11之前非常有效,但在此版本之后,带有参数化构造函数的模块将无法正常工作,从而无法提供上下文,更不用说应用程序了。那么如何将新的AndroidInjection()功能用于Dagger 2.16的集成测试?

1 个答案:

答案 0 :(得分:1)

我想出了以下方法来将上下文注入dagger 2.11+的模块中,所以从头开始,我仍然不知道如何从集成测试的角度来处理应用程序。

@Singleton
@Component(modules = arrayOf(SpotifyAccountsModule::class,SpotifyApiModule::class))
interface SpotifyTestComponent {
    fun inject(test: SpotifyApiTest)
    fun inject(test: SpotifyAccountApiTest)

    @Component.Builder
    interface Builder {
        @BindsInstance
        fun create(context: Context): Builder
        fun build(): SpotifyTestComponent
    }
}

这将使上下文成为提供者的参数,并在其他人到达此特定砖墙时为他们提供帮助。