Search code examples
javakotlinjunitandroid-room

Get applicationContext in JUnit tests for RoomDB


I cant get application context to create Room database in tests

@RunWith(AndroidJUnit4::class)
//@RunWith(RobolectricTestRunner::class)
class AppDatabaseTest {

    private lateinit var context: Context
    private lateinit var database: AppDatabase

    @Test
    fun someTest() {
        context = ApplicationProvider.getApplicationContext()
        // RuntimeEnvironment.getApplication()

        database = Room.inMemoryDatabaseBuilder(
            context,
            AppDatabase::class.java
        ).build()

        assertEquals(2, 1+1)
    }
}

When i tried to acheave that by ApplicationProvider.getApplicationContext() it falls with next exception

No instrumentation registered! Must run under a registering instrumentation.
java.lang.IllegalStateException: No instrumentation registered! Must run under a registering instrumentation.
    at androidx.test.platform.app.InstrumentationRegistry.getInstrumentation(InstrumentationRegistry.java:45)
    at androidx.test.core.app.ApplicationProvider.getApplicationContext(ApplicationProvider.java:41)
    at com.olexii8bit.notesapp.data.room.AppDatabaseTest.someTest(AppDatabaseTest.kt:19)

And I tried RuntimeEnvironment.getApplication() from Robolectric but it also throws an exception

getApplication(...) must not be null
java.lang.NullPointerException: getApplication(...) must not be null
    at com.olexii8bit.notesapp.data.room.AppDatabaseTest.someTest(AppDatabaseTest.kt:20)

What am i doing wrong?


Solution

  • The solution is to create tests in androidTest module instead of unitTest. enter image description here

    Then you will be able to use context with InstrumentationRegistry.getInstrumentation().targetContext