web-dev-qa-db-ja.com

AndroidX:インストルメンテーションが登録されていません!登録計装下で実行する必要があります

私はコンテキストに依存するローカルユニットテストを実行しようとしていますが、このガイドに従っていました: https://developer.Android.com/training/testing/unit-testing/local-unit-tests# kotlin そして、次のようにプロジェクトを設定します(このリンクに従ってください: https://developer.Android.com/training/testing/set-up-project ):

build.gradle(app)

Android {
compileSdkVersion 28
buildToolsVersion '27.0.3'
defaultConfig {
    minSdkVersion 21
    targetSdkVersion 27
    versionCode 76
    versionName "2.6.0"
    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    multiDexEnabled true

useLibrary 'Android.test.runner'
    useLibrary 'Android.test.base'
    useLibrary 'Android.test.mock'

}
testOptions {
    unitTests.returnDefaultValues = true
    unitTests.all {
        // All the usual Gradle options.
        testLogging {
            events "passed", "skipped", "failed", "standardOut", "standardError"
            outputs.upToDateWhen { false }
            showStandardStreams = true
        }
    }
    unitTests.includeAndroidResources = true

}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')

androidTestImplementation("androidx.test.espresso:espresso-core:$espressoVersion", {
    exclude group: 'com.Android.support', module: 'support-annotations'
})
// Espresso UI Testing dependencies
implementation "androidx.test.espresso:espresso-idling-resource:$espressoVersion"
androidTestImplementation "androidx.test.espresso:espresso-contrib:$espressoVersion"
androidTestImplementation "androidx.test.espresso:espresso-intents:$espressoVersion"

testImplementation 'androidx.test:core:1.0.0'

// AndroidJUnitRunner and JUnit Rules
androidTestImplementation 'androidx.test:runner:1.1.0'
androidTestImplementation 'androidx.test:rules:1.1.0'
// Espresso Assertions
androidTestImplementation 'androidx.test.ext:junit:1.0.0'
androidTestImplementation 'androidx.test.ext:truth:1.0.0'
androidTestImplementation 'com.google.truth:truth:0.42'
    implementation 'androidx.multidex:multidex:2.0.0'
}

私のespresso_versionはespressoVersion = '3.1.0'

module-name/src/test/Java /にある私のテストは次のようになります。

    import Android.content.Context
import androidx.test.core.app.ApplicationProvider
import com.instacart.library.truetime.TrueTime
import edu.mira.aula.shared.extensions.Android.trueDateNow
import edu.mira.aula.shared.network.ConnectivityHelper
import kotlinx.coroutines.experimental.runBlocking
import org.junit.Assert
import org.junit.Before
import org.junit.Test
import Java.util.*
import Java.util.concurrent.CountDownLatch

class TimeExtensionsUnitTest {
private lateinit var instrumentationCtx: Context

@Before
fun setup() {
    instrumentationCtx = ApplicationProvider.getApplicationContext<Context>()
}
 @Test
fun testTrueTimeValueReturnsIfInitialized() {
    if (ConnectivityHelper.isOnline(instrumentationCtx)) {
        runBlocking {
            val countDownLatch = CountDownLatch(1)
            TrueTime.build()
                    .withSharedPreferencesCache(instrumentationCtx)
                    .withConnectionTimeout(10000)
                    .initialize()
            countDownLatch.countDown()

            try {
                countDownLatch.await()
                val dateFromTrueTime = trueDateNow()
                val normalDate = Date()
                Assert.assertNotEquals(dateFromTrueTime, normalDate)
            } catch (e: InterruptedException) {
            }
        }
    }
}

それを実行するたびに、それは私に与えます:

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)

インストルメンタルテスト(パッケージの変更)として実行すると、エラーなしで実行されます。しかし、このガイドは、コンテキストなどのAndroidフレームワーククラスを使用して単体テストを実行できるようになると考えました。 class UnitTestSampleを実行しようとしましたが、同じエラーが発生します。

プロジェクトからすべてのAndroid.support依存関係も削除しました

それを解決する方法についてのアイデアはありますか?

22
julioribeiro

更新

最新のgradleバージョンを使用している場合、このエラーは発生しないはずです。


私もこの問題に遭遇しました。

Robolectric 4.0 here への移行を検討する場合は、gradle.propertiesに次の行を追加することをお勧めします。

Android.enableUnitTestBinaryResources=true

問題は、これをgradle.propertiesに追加すると、次の警告が出力されることです。

警告:オプション設定「Android.enableUnitTestBinaryResources = true」は実験的であり、サポートされていません。

さて、Robolectricのリリースを見ると こちら です。これは既知の問題であることがわかります。

Android Gradleプラグインは次の警告を報告する場合がありますが、無視しても問題ありません:警告:オプション設定 'Android.enableUnitTestBinaryResources = true'は実験的でサポートされていません。Android Gradle Plugin 3.4はこの問題を解決します。

Gradleを3.4に更新できない限り、私は信じています。この問題を解決することはできません。

その代わりに、Robolectric 4.0を依存関係として含めるようにしました。

testImplementation "org.robolectric:robolectric:4.0.2"

テストクラスに注釈を付けます

@RunWith(RobolectricTestRunner::class)

これでテストが機能するはずです。

これで、テストを実行すると、Robolectricが次のログを記録することに気付くでしょう。

[Robolectric]注意:レガシーリソースモードは非推奨です。 http://robolectric.org/migrating/#migrating-to-4 を参照してください

今のところこれを無視しますが、Gradleを更新できるようになり次第、新しいRobolectricテストに移行してください。

10

私は同様のエラーがあり、それを修正するのに苦労していました。私の問題は、AndroidJUnit4InstrumentationRegistryApplicationProvider、およびAndroidJUnitRunnerversions /パッケージを混合していたことです。それらがすべて同じ世代であることを確認してください。これらはすべて私のために実行したクラスです:

  • androidx.test.runner.AndroidJUnitRunner
  • androidx.test.platform.app.InstrumentationRegistry
  • androidx.test.ext.junit.runners.AndroidJUnit4
  • androidx.test.core.app.ApplicationProvider

これらのために、build.gradleのdependencies部分に次のものが必要でした。

androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
androidTestImplementation 'androidx.test:core:1.1.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.0'
androidTestImplementation "com.Android.support:support-annotations:27.1.1"
androidTestImplementation 'com.Android.support.test:runner:1.0.2'
androidTestImplementation 'com.Android.support.test:rules:1.0.2'

そしてもちろん正しい

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

build.gradledefaultConfig

2
Boris Strandjev