构建本地单元测试(未注册任何工具!必须在注册工具下运行)

25

请查看官方文档。章节"包含框架依赖项"给出了如何设置本地单元测试以与环境android sdk一起工作的示例。但是,如果您按照示例的步骤进行操作,则测试不会启动,而是会出现以下错误:

java.lang.IllegalStateException: No instrumentation registered! Must run under a registering instrumentation.

我已经尝试在一个新项目上执行了所有操作。使用的是Android Studio 3.3、gradle-4.10.1、build:gradle:3.3.0、Kotlin和包括Androidx artifacts。

然后将以下行添加到具有指定配置的项目中:

build.gradle

android {
    // ...
    testOptions {
        unitTests.includeAndroidResources = true
    }
}

dependencies {
    // ...
    // Already exist
    testImplementation 'junit:junit:4.12'
    // Added this line
    testImplementation 'androidx.test:core:1.0.0'
}

还有测试主体本身:

package com.example.myapplication

import android.content.Context
import androidx.test.core.app.ApplicationProvider
import org.junit.Test

class ExampleUnitTest {

    val context = ApplicationProvider.getApplicationContext<Context>()

    @Test
    fun readStringFromContext_LocalizedString() {
        System.out.println(context.applicationInfo.packageName)
    }
}

我做错了什么吗?


apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.myapplication"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    testOptions {
        unitTests.includeAndroidResources = true
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.0.0-beta01'
    implementation 'androidx.core:core-ktx:1.1.0-alpha03'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.2'
    testImplementation 'junit:junit:4.12'
    testImplementation 'androidx.test:core:1.0.0'
    androidTestImplementation 'androidx.test:runner:1.1.0-alpha4'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-alpha4'
}

你的测试文件位于test文件夹内还是androidTest文件夹内? - Kaveri
@Kaveri 我需要本地单元测试,所以文件位于测试目录中。 - maXp
1
但是,由于您在测试中使用了上下文,因此应该使用放置在androidTest文件夹中的仪器化单元测试。 - Kaveri
9
谢谢,但是不,我需要在本地运行的单元测试而不是在 android 设备上运行。如果你仔细阅读链接中的文档,你就会明白可以通过 Robolectric 实现这一点。但出于某种原因,文档中提供的示例不能正常工作,而我也不清楚原因。 - maXp
1个回答

15

更新:

如果您使用最新的Gradle版本,则不应再遇到此错误。


我猜您需要在您的build.gradle中包含Robolectric依赖项,并为您的测试指定测试运行器:

@RunWith(RobolectricTestRunner.class)
class ExampleUnitTest {

之后它对我有用了。我不知道为什么这些信息未包含在Android文档中。


7
谢谢!最终,我就是这样做了,但我也不明白为什么这个步骤没有被包含在文档中。 - maXp
1
这不在文档中,因为Robolectric只是作为Java和Android之间的桥梁而需要,以便在“非测仪”测试(纯JUnit测试,可以这么说)中让您访问特定于Android的类。如果您运行测仪测试(例如Espresso测试),它们将可以访问框架的所有类,因此根本不需要像Robolectric这样的库。 - Jorge
4
请查看文档部分:“如果您的测试与多个Android框架依赖项交互,或以复杂的方式与这些依赖项交互,请使用AndroidX Test提供的Robolectric构件”。但是测试运行器注释缺失,这很奇怪。在这种情况下,我们不是在谈论纯JUnit测试。我们也不是在讨论插桩测试。 - Vadim Kotov
已更新我的回答,现在不再需要这个测试运行器注释。 - Vadim Kotov
“latest gradle version”指的是哪个版本?这对于想知道他们是否需要更新或者已经使用比你所提到的版本更新的版本的人会很有帮助。 - arekolek
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接