android - 无法使用 RobolectricTestRunner 和 Koin 运行单元测试

标签 android unit-testing robolectric koin

我有一个带有 RobolectricTestRunner 的测试类,我用它来获取应用程序上下文,并且我还用 KoinComponent 扩展了一个类。当我开始测试时,它返回java.lang.IllegalStateException:KoinApplication尚未启动并指向扩展KoinComponent的类。我尝试在 setUp() 方法中启动 Koin 并加载模块并删除 Robolectric,但这样它无法找到应用程序上下文。有没有办法用 Robolectric 和 Koin 编写单元测试?

最佳答案

As you can read here在 AndroidManifest 中声明的 BroadcastReceivers 在应用程序的 onCreate 之前创建。因此,Koin尚未初始化。解决方法是为广播接收器创建一个帮助程序并惰性初始化该帮助程序:

class MyBroadcastReceiver : BroadcastReceiver() {

    // Broadcast Receivers declared in the AndroidManifest get created before your Application's onCreate.
    // The lazy initialization ensures that Koin is set up before the broadcast receiver is used
    private val koinHelper: BroadcastReceiverHelper
        by lazy { BroadcastReceiverHelper() }

    override fun onReceive(context: Context, intent: Intent) {
        koinHelper.onReceive(context, intent)
    }
}

class BroadcastReceiverHelper : KoinComponent {

    private val myClassToInject: MyClassToInject by inject()

    fun onReceive(context: Context, intent: Intent) {
        // do stuff here
    }
}

关于android - 无法使用 RobolectricTestRunner 和 Koin 运行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57373568/

相关文章:

java - ArrayException越界

javascript - 使用 Jasmine 使用异步 api 测试 Flux 存储

jquery - 如何使用Jasmine测试jquery的点击函数,看看它是否调用了自定义方法?

android - 是否可以使用 Robolectric 进行集成测试?

android - Cordova PushPlugin 在 Android 模拟器上未收到通知

c# - Xamarin.android-如何更快地加密/解密图像

java - 如何使用 jmockit 模拟 RestTemplate getForObject 方法?

android - 使用 Robolectric 测试网页是否通过 intent 成功打开

android - Firebase + RoboElectric : java. lang.IllegalStateException:名称为 [DEFAULT] 的 FirebaseApp 不存在

android - sqlite 更新在 android lollipop 中失败但在 kitkat 上有效?