【问题标题】:How to use android.test.mock in Android Studio如何在 Android Studio 中使用 android.test.mock
【发布时间】:2019-05-05 21:34:18
【问题描述】:

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

我不确定我应该向 Gradle 添加什么才能导入它。我试过com.android.support.test:rules:1.0.2androidx.test:rules:1.1.1(IDE 提出的建议之一),但这不是我要找的。​​p>

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 这没有帮助,但感谢您了解:) 已编辑。
  • 这里有同样的问题!奇怪的是,Siena 的答案不适用于我的 库模块 的测试...然后在我的 应用程序模块 的 build.gradle 中添加 useLibrary 'android.test.mock' 修复了失败进口!!!在我的 库模块 测试中。奇怪...

标签: android unit-testing


【解决方案1】:

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

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

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

【讨论】:

  • Explanation of useLibrary:该指令在构建时将库添加到类路径中,但不会将库添加到 APK。
【解决方案2】:

该类是一个框架类,而不是来自库。您可以通过包名来判断:android.(而不是com.android.androidx.)中的任何内容都是框架类。因此,您只能将其用于仪器测试,而不是单元测试。

您可以创建自定义模拟(例如,使用 Mockito)或使用 Robolectric,具体取决于您要执行的操作。

【讨论】:

  • 啊,我明白了。我希望有一个易于使用的模拟。但是为什么android.content.Context 在单元测试中起作用呢?它似乎也仅以android. 开头。
  • @Yksisarvinen:这取决于你所说的“工作”是什么意思。您将无法在模拟之外的单元测试中创建或获取Context。但你确实提出了一个好观点:我不确定为什么你的 import 不起作用。
【解决方案3】:

接受的答案建议使用android.test.mock。从某种意义上说,这可以工作,您可以使用它运行测试。但是,这是一种矫枉过正,因为这意味着您将进行仪器测试而不是单元测试。这带来了进行仪器测试的所有含义和开销等,而如果您只需要一个用于单元测试的上下文对象,则没有必要也不建议使用android.test.mock

此外,上面的问题实际上是要求某种 Context 对象用于单元测试。 Google 的 developer documentation 确实解决了这个问题,示例代码导入了 android.content.Context,然后使用 Mockito 模拟它。

但是android.content.Context 不是框架类吗?那么如何在单元测试而不是仪器测试中使用它呢?在developer reference for android.content.Context 中可以看到,它是一个抽象类。因此,它适用于使用 Mockito 进行简单的模拟。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-21
    • 2021-08-29
    • 2014-11-14
    • 2014-04-10
    • 2014-01-20
    • 2017-06-18
    • 2016-07-18
    • 1970-01-01
    相关资源
    最近更新 更多