如何解决自定义应用程序类时无法启动junit测试
当我尝试开始自己的junit
测试之一时,由于多个错误,所有测试都失败了。这是由于这样的事实,我的Application class
中包含一些变量,这些变量是在“正常”应用启动时初始化的,但是在我开始测试时却没有。注释掉变量可能有帮助,但这是一个丑陋的解决方案,在开始测试时总是注释掉东西。
应用程序类
@HiltAndroidApp
@InternalCoroutinesApi
class App : Application(),Configuration.Provider {
@Inject lateinit var workerFactory: HiltWorkerFactory
@Inject lateinit var workerList: WorkerList
override fun onCreate() {
super.onCreate()
plantTimberTree()
enableOfflinePersistence()
workerList.startDownloadDocumentWork()
}
override fun getWorkManagerConfiguration(): Configuration =
Configuration.Builder().setWorkerFactory(workerFactory).build()
}
private fun plantTimberTree() = Timber.plant(Timber.DebugTree())
private fun enableOfflinePersistence() {
val settings = firestoreSettings { isPersistenceEnabled = true }
Firebase.firestore.firestoreSettings = settings
}
TestCase
@RunWith(RobolectricTestRunner::class)
@Config(maxsdk = Build.VERSION_CODES.P,minSdk = Build.VERSION_CODES.P)
class EmailviewmodelTest {
}
错误Stacktrace(无任何评论)
java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process null. Make sure to call FirebaseApp.initializeApp(Context) first.
at com.google.firebase.FirebaseApp.getInstance(FirebaseApp.java:184)
at com.google.firebase.firestore.FirebaseFirestore.getInstance(FirebaseFirestore.java:91)
at com.google.firebase.firestore.ktx.FirestoreKt.getFirestore(Firestore.kt:32)
at com.example.app.AppKt.enableOfflinePersistence(App.kt:44)
at com.example.app.AppKt.access$enableOfflinePersistence(App.kt:1)
at com.example.app.App.onCreate(App.kt:24)
at org.robolectric.android.internal.AndroidTestEnvironment.lambda$installAndCreateApplication$0(AndroidTestEnvironment.java:288)
at org.robolectric.util.PerfStatsCollector.measure(PerfStatsCollector.java:75)
at org.robolectric.android.internal.AndroidTestEnvironment.installAndCreateApplication(AndroidTestEnvironment.java:288)
at org.robolectric.android.internal.AndroidTestEnvironment.setUpApplicationState(AndroidTestEnvironment.java:171)
at org.robolectric.RobolectricTestRunner.beforeTest(RobolectricTestRunner.java:319)
at org.robolectric.internal.SandBoxTestRunner$2.lambda$evaluate$0(SandBoxTestRunner.java:254)
at org.robolectric.internal.bytecode.SandBox.lambda$runOnMainThread$0(SandBox.java:89)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
错误Stacktrace(注释掉“ enableOfflicePersistence”时)
kotlin.UninitializedPropertyAccessException: lateinit property workerList has not been initialized
at com.example.app.App.onCreate(App.kt:25)
at org.robolectric.android.internal.AndroidTestEnvironment.lambda$installAndCreateApplication$0(AndroidTestEnvironment.java:288)
at org.robolectric.util.PerfStatsCollector.measure(PerfStatsCollector.java:75)
at org.robolectric.android.internal.AndroidTestEnvironment.installAndCreateApplication(AndroidTestEnvironment.java:288)
at org.robolectric.android.internal.AndroidTestEnvironment.setUpApplicationState(AndroidTestEnvironment.java:171)
at org.robolectric.RobolectricTestRunner.beforeTest(RobolectricTestRunner.java:319)
at org.robolectric.internal.SandBoxTestRunner$2.lambda$evaluate$0(SandBoxTestRunner.java:254)
at org.robolectric.internal.bytecode.SandBox.lambda$runOnMainThread$0(SandBox.java:89)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
有没有一种方法可以确定测试是否已经开始?我应该如何更改Application类以使测试再次运行?
感谢您的帮助。
解决方法
这可以通过实现Roboelectric库来解决,因为它提供了运行测试的android环境。
检查以下链接以获取有关如何使用它的详细说明。我发现它非常有用。
https://codelabs.developers.google.com/codelabs/advanced-android-kotlin-training-testing-basics/#0
,我看到您正在使用RobolectricTestRunner。
有两种不同的方法可以解决FirebaseApp在Robolectric测试期间进入怪异状态的问题,以及解决方法:如果正常初始化Application类,它将如何运行。
(1)您可以使用Robolectric指定要使用的特殊测试应用程序上下文,该上下文可以对Firebase进行任何操作。
(2)您可以使用Roboelectric为FirebaseApp创建一个影子类,该影子类可以按照您希望的任何方式运行。 (这是一个example,其中我有影子类捕获您引用的异常并初始化Firebase。)
为FirebaseApp编写影子类的好处是,可以将其配置为以代码访问FirebaseApp的任何方式进行干预,而robolectric.properties file可以配置您的整个测试包。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。