【问题标题】:org.koin.android.error.MissingAndroidContextException: when try to test app with contextorg.koin.android.error.MissingAndroidContextException:尝试使用上下文测试应用程序时
【发布时间】:2022-05-08 02:01:33
【问题描述】:

我想为koin 编写测试。我使用RoomDatabase,它在构造函数中接收上下文。应用运行良好,但测试失败

无法解析应用程序实例。请使用 androidContext() 在您的 KoinApplication 配置中运行。

【问题讨论】:

    标签: android koin


    【解决方案1】:

    如果你想在你的模块中使用上下文,你应该在你的 start koin 方法中传递上下文

    // start Koin!
        startKoin {
    
          // declare used Android context
          androidContext(this@MyApplication)
    
          // declare modules
          modules(yourModule)
        }
    

    并使用这些库

        // Koin AndroidX Scope features
        implementation "org.koin:koin-android-scope:2.0.1"
    // Koin AndroidX ViewModel features
        implementation 'org.koin:koin-androidx-viewmodel:2.0.1'
    // Koin AndroidX Experimental features
        implementation "org.koin:koin-android-ext:2.0.1"
    

    【讨论】:

    • 在我的情况下,它不起作用,你经历过吗?
    • 所以你在使用新的 koin 库后又遇到了同样的错误?你可以发布你的错误日志吗?用你的 qtn
    • org.koin.android.error.MissingAndroidContextException:无法解析上下文实例。请在 KoinApplication 配置中使用 androidContext() 函数。
    • 我根据您在问题中显示的异常给出答案..我认为您的模块定义有误。请确保上下文正确传递
    • startKoin{ androidLogger() androidContext(this@MyApp) 模块(appModule) }
    【解决方案2】:

    确保在开始 koin 时设置上下文。然后你应该可以通过模块中的 androidContext() 访问它。

    startKoin {
        androidContext(this@App)
        modules(...)
        ...
    }
    

    【讨论】:

    • 在我的情况下,它不起作用,你经历过吗?
    【解决方案3】:

    对于单元测试我已经实现了这个

    @file:JvmName("KoinTest")
    package com.myapp.di
    
    import androidx.test.core.app.ApplicationProvider
    import org.koin.android.ext.koin.androidContext
    import org.koin.core.context.startKoin
    
    fun startKoin() {
        startKoin {
            androidContext(ApplicationProvider.getApplicationContext())
            modules(listOf(applicationModule, networkModule))
        }
    }
    
    fun stopKoin() {
        org.koin.core.context.stopKoin()
    }
    

    我可以在我们的旧 Java 测试中将其称为 KoinTest.startKoin() 或在 Kotlin 中仅称为 startKoin()。我从@Before@After 块中适当地调用它们。 android 上下文是使用新的 AndroidX 测试库函数设置的。

    【讨论】:

      【解决方案4】:

      您无法使用 Koin 在单元测试中测试 Room。您只能在仪器测试中进行测试。

      【讨论】:

        【解决方案5】:

        就我而言,我将应用程序类编辑为:

        class App : Application() {
            override fun onCreate() {
                super.onCreate()
        
                startKoin {
        
                    androidContext(this@App)
        
                    modules(viewModelModule)
                }
            }
        }
        

        【讨论】:

          【解决方案6】:

          KOIN:3.2.0-beta-1

          // Koin Core features
              implementation "io.insert-koin:koin-core:3.2.0-beta-1"
              implementation "io.insert-koin:koin-android:3.2.0-beta-1"
          

          在 startkoin 下声明上下文,如下所示

          androidContext(this@KoinSampleApplication)
          

          class KoinSampleApplication : Application() {
          
          override fun onCreate() {
              super.onCreate()
              startKoinDI()
          }
          
          private fun startKoinDI() {
              startKoin {
          
                  // declare context
                  androidContext(this@KoinSampleApplication)
          
                  // declare modules
                  modules(
                      networkModule,
                      repositoryModule,
                      servicesModule,
                      utilityModule,
                      viewModelModule,
                  )
          
              }
              }
          }
          

          希望它会起作用。

          【讨论】:

            猜你喜欢
            • 2011-12-05
            • 2013-08-17
            • 2021-07-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-07-20
            相关资源
            最近更新 更多