如何在Android Studio中使用android.test.mock

10

我正在尝试在Android Studio中的Android项目的单元测试中使用MockContext。问题是,android.test.* 包在项目中不可见。

我不确定应该在Gradle中添加什么才能导入它。我尝试了 com.android.support.test:rules:1.0.2androidx.test:rules:1.1.1(由IDE提供的建议之一), 但那不是我要找的。

build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.myApp"
        minSdkVersion 23
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    //noinspection GradleCompatible
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support:design:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.google.firebase:firebase-core:16.0.8'
    implementation 'com.android.support:recyclerview-v7:28.0.0'
    testImplementation 'com.android.support.test:rules:1.0.2'
}

apply plugin: 'com.google.gms.google-services'

编译时的错误信息:

错误:找不到android.test.mock包

我应该添加什么到gradle才能访问android.test包?


你在那个依赖中使用了 implementation。尝试使用 testImplementation - CommonsWare
@CommonsWare 那并没有帮助,但感谢您指出 :) 已编辑。 - Yksisarvinen
我也遇到了同样的问题!奇怪的是,Siena的答案在我的库模块测试中没有起作用...然后在我的应用程序模块的build.gradle中添加useLibrary 'android.test.mock'修复了失败的导入!!!在我的库模块测试中。奇怪... - acrespo
3个回答

14

实际上,您可以从单元测试中使用 android.test.mock 并访问 MockContext 类。 对于 AndroidX 项目,您可以在应用程序模块的 build.gradle 中添加以下内容:

android {
    ...
    useLibrary 'android.test.mock'
}

来源:https://developer.android.com/training/testing/set-up-project


1
useLibrary的解释:此指令在构建时将库添加到类路径,但不会将库添加到APK中。 - Lii
不太有用,因为它不起作用。我添加了这行代码,但仍然无法访问MockContext,而且在文档中也没有找到任何有用的信息。 - Renetik

2
那个类是框架类,而不是来自于库。你可以从包名看出来: 任何在 android. 中的类 (而不是 com.android.androidx.) 都是框架类。因此,你只能在仪器测试中使用它,而不能在单元测试中使用。
你可以创建自定义模拟对象 (例如,使用 Mockito),或者根据你所需做的事情使用 Robolectric

啊,我明白了。我希望有一个易于使用的模拟。但是为什么在单元测试中可以使用“android.content.Context”?它似乎也以“android.”开头。 - Yksisarvinen
@Yksisarvinen:这取决于你所说的“work”的含义。在单元测试中,除了模拟之外,你无法创建或获取Context。但你提出了一个很好的观点:我不确定为什么你的import没有起作用。 - CommonsWare
Mockk框架的最新版本在模拟Android上下文时失败了,我无法使用Robolectric。 - Renetik

1
接受的答案建议使用android.test.mock。这可以工作,意味着您可以使用它运行测试。然而,这有点过度杀伤力,因为这意味着您将进行仪器测试而不是单元测试。这带来了所有相关的含义和开销等等,而如果您只需要一个上下文对象进行单元测试,则不需要也不建议使用android.test.mock
此外,上面的问题实际上正在寻求某种上下文对象用于单元测试。谷歌的developer documentation确实回答了这个问题,并提供了导入android.content.Context的示例代码,然后使用Mockito进行模拟。
但是,android.content.Context不是框架类吗?那么它如何在单元测试而不是仪表测试中使用?正如android.content.Context的开发人员参考中所示,它是一个抽象类。因此,它适合使用Mockito进行简单的模拟。

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