nickbutcher / plaid

An Android app which provides design news & inspiration as well as being an example of implementing material design.
Apache License 2.0
16.26k stars 3.16k forks source link

`LoggedInUserDaoTest` fails, fails and hangs indefinitely #825

Open mateuszkwiecinski opened 4 years ago

mateuszkwiecinski commented 4 years ago

This repository is being mentioned multiple times as a showcase how to solve different problems when struggling with Android framework. I came here to learn how to test room with suspendable functions so I checked out LoggedInUserDao with corresponding test LoggedInUserDaoTest

When I tried to run it I imediately got a crash at:

 java.lang.RuntimeException: Unable to get provider com.google.firebase.provider.FirebaseInitProvider: android.content.res.Resources$NotFoundException: Unable to find resource ID #0x7f10002d
        at android.app.ActivityThread.installProvider(ActivityThread.java:6396)
        at android.app.ActivityThread.installContentProviders(ActivityThread.java:5938)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5853)
        at android.app.ActivityThread.access$1100(ActivityThread.java:199)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1650)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
     Caused by: android.content.res.Resources$NotFoundException: Unable to find resource ID #0x7f10002d
        at android.content.res.ResourcesImpl.getResourcePackageName(ResourcesImpl.java:263)
        at android.content.res.Resources.getResourcePackageName(Resources.java:1970)
        at com.google.android.gms.common.internal.StringResourceValueReader.<init>(Unknown Source:5)
        at com.google.firebase.FirebaseOptions.fromResource(com.google.firebase:firebase-common@@17.1.0:160)
        at com.google.firebase.FirebaseApp.initializeApp(com.google.firebase:firebase-common@@17.1.0:248)
        at com.google.firebase.provider.FirebaseInitProvider.onCreate(com.google.firebase:firebase-common@@17.1.0:53)
        at android.content.ContentProvider.attachInfo(ContentProvider.java:1917)
        at android.content.ContentProvider.attachInfo(ContentProvider.java:1892)
        at com.google.firebase.provider.FirebaseInitProvider.attachInfo(com.google.firebase:firebase-common@@17.1.0:47)
        at android.app.ActivityThread.installProvider(ActivityThread.java:6391)
        at android.app.ActivityThread.installContentProviders(ActivityThread.java:5938) 
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5853) 
        at android.app.ActivityThread.access$1100(ActivityThread.java:199) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1650) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:193) 
        at android.app.ActivityThread.main(ActivityThread.java:6669) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 

I'm an android developer, I got used to runtime crashes so I removed firebase dependency as a workaround to skip its initialization and just run the tests. But then I got:

$ adb shell am instrument -w -m    -e package io.plaidapp.designernews.data.database -e debug false io.plaidapp.designernews.test/androidx.test.runner.AndroidJUnitRunner
Connected to process 11665 on device 'Pixel_2_API_28 [emulator-5554]'.

Started running tests

kotlin.UninitializedPropertyAccessException: lateinit property database has not been initialized
    at io.plaidapp.designernews.data.database.LoggedInUserDaoTest.tearDown(LoggedInUserDaoTest.kt:61)
    at java.lang.reflect.Method.invoke(Native Method)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:80)
    at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
    at org.junit.rules.RunRules.evaluate(RunRules.java:20)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at androidx.test.ext.junit.runners.AndroidJUnit4.run(AndroidJUnit4.java:104)
    at org.junit.runners.Suite.runChild(Suite.java:128)
    at org.junit.runners.Suite.runChild(Suite.java:27)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
    at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
    at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:389)
    at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2145)

Again runtime crash 👌
So let's add the dependency: kapt "androidx.room:room-compiler:${versions.room}" to make sure room classes there will actually be generated.

After all of that I faced issue that I could solve myself, the test were just stuck:

image

Does anyone here know how to test LoggedInUserDao class?