Must run under a registering instrumentation エラーの対応


コンストラクタでApplicationを必要とするViewModelのテストを書いているときに、以下のエラーが発生した。

app/build.gradle

dependencies {
    // ApplicationProviderを使用するために必要
    testImplementation 'androidx.test:core:1.4.0'
}

SampleViewModelTest.kt

class SampleViewModelTest {

    private lateinit var viewModel: SampleViewModelTest

    @Before
    fun setUp() {
        // Error
        val application = ApplicationProvider.getApplicationContext<Application>()
        viewModel = SampleViewModelTest(application)
    }

    @Test
    fun test() {

    }
}

Error

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)

原因

getApplicationContextContextを取得しているため、Robolectricが必要。

修正

app/build.gradle

dependencies {
    // Add
    testImplementation 'org.robolectric:robolectric:4.4'
    testImplementation 'androidx.test:core:1.4.0'
}

SampleViewModelTest.kt

// Add annotation
@RunWith(RobolectricTestRunner::class)
class SampleViewModelTest {

    private lateinit var viewModel: SampleViewModelTest

    @Before
    fun setUp() {
        val application = ApplicationProvider.getApplicationContext<Application>()
        viewModel = SampleViewModelTest(application)
    }

    @Test
    fun test() {

    }
}