google / dagger

A fast dependency injector for Android and Java.
https://dagger.dev
Apache License 2.0
17.41k stars 2.01k forks source link

Hilt test throws java.lang.RuntimeException on run time #3269

Open Hungon opened 2 years ago

Hungon commented 2 years ago

Summary

Using the latest version 2.41, we encountered the exception on the local machine when executing tests, but this does not happen on CI.(Every test succeed)

An error like this:

java.lang.RuntimeException: Hilt test, SampleTest, is missing generated file: domain.SampleTest_TestComponentDataSupplier. Check that the test class is annotated with @HiltAndroidTest and that the processor is running over your test.

    at dagger.hilt.android.internal.testing.TestComponentDataSupplier.get(TestComponentDataSupplier.java:39)
    at dagger.hilt.android.internal.testing.TestApplicationComponentManager.testComponentData(TestApplicationComponentManager.java:313)
    at dagger.hilt.android.internal.testing.TestApplicationComponentManager.requiredModules(TestApplicationComponentManager.java:293)
    at dagger.hilt.android.internal.testing.TestApplicationComponentManager.tryToCreateComponent(TestApplicationComponentManager.java:262)
    at dagger.hilt.android.internal.testing.TestApplicationComponentManager.setHasHiltTestRule(TestApplicationComponentManager.java:130)
    at dagger.hilt.android.internal.testing.MarkThatRulesRanRule$1.evaluate(MarkThatRulesRanRule.java:107)
    at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
    at org.robolectric.RobolectricTestRunner$HelperTestRunner$1.evaluate(RobolectricTestRunner.java:570)
    at org.robolectric.internal.SandboxTestRunner$2.lambda$evaluate$0(SandboxTestRunner.java:278)
    at org.robolectric.internal.bytecode.Sandbox.lambda$runOnMainThread$0(Sandbox.java:89)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.lang.ClassNotFoundException: domain.SampleTest_TestComponentDataSupplier
    at org.robolectric.internal.bytecode.SandboxClassLoader.getByteCode(SandboxClassLoader.java:182)
    at org.robolectric.internal.bytecode.SandboxClassLoader.maybeInstrumentClass(SandboxClassLoader.java:140)
    at org.robolectric.internal.bytecode.SandboxClassLoader.lambda$loadClass$0(SandboxClassLoader.java:126)
    at org.robolectric.util.PerfStatsCollector.measure(PerfStatsCollector.java:53)
    at org.robolectric.internal.bytecode.SandboxClassLoader.loadClass(SandboxClassLoader.java:126)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:315)
    at dagger.hilt.android.internal.testing.TestComponentDataSupplier.get(TestComponentDataSupplier.java:30)
    ... 13 more

Process finished with exit code 255

Code we can produce:

@HiltAndroidTest
@RunWith(AndroidJUnit4::class)
@Config(sdk = [28], application = HiltTestApplication::class)
class SampleTest {

    @get:Rule
    var hiltRule = HiltAndroidRule(this)

    @Inject
    lateinit var sample: Sample

    @Before
    fun init() {
        hiltRule.inject()
    }

    @Test 
    fun testSample() {
        // test code
    }
}

Versions

Is there any info you need?

bcorso commented 2 years ago

@Hungon it sounds like you may not have added the Dagger compiler to your tests. Can you check that you have the following dependency:

dependencies {
    // ...
    kaptTest 'com.google.dagger:hilt-compiler:2.41'
}
Hungon commented 2 years ago

@bcorso Thank you for your help. Let me check it.