155

显然我需要正确的导入语句来解决这个问题。根据文档AndroidJUnit4,这应该是

import android.support.test.runner.AndroidJUnit4;

当我这样做时,Android Studiorunner以红色突出显示并抱怨“无法解析符号 'runner'”。

背景

我通过遵循 Android 开发者网站上的教程使用 UI Automator 设置测试来达到这一点。我遇到的第一个问题是,com.android.support:support-v4:22.2.0并且com.android.support.test:runner:0.2依赖于不同版本的com.android.support:support-annotations. 我遵循了这个 Android 错误报告中的建议,并将以下内容添加到allprojects中的建议,并在我的项目中build.gradle

configurations.all {
    resolutionStrategy.force 'com.android.support:support-annotations:22.1.0'
}

这解决了直接错误,但我怀疑它会导致我当前的问题。有人对如何解决这个问题有任何建议吗?

来自 `./gradlew :app:dependencies 的相关部分

androidTestCompile - Classpath for compiling the androidTest sources.
+--- com.jayway.android.robotium:robotium-solo:5.2.1
+--- com.squareup:fest-android:1.0.8
|    \--- org.easytesting:fest-assert-core:2.0M10
|         \--- org.easytesting:fest-util:1.2.5
+--- com.android.support.test:runner:0.2
|    +--- junit:junit-dep:4.10
|    |    \--- org.hamcrest:hamcrest-core:1.1
|    +--- com.android.support.test:exposed-instrumentation-api-publish:0.2
|    \--- com.android.support:support-annotations:22.0.0 -> 22.2.0
+--- com.android.support.test:rules:0.2
|    \--- com.android.support.test:runner:0.2 (*)
\--- com.android.support.test.uiautomator:uiautomator-v18:2.1.0

compile - Classpath for compiling the main sources.
+--- com.android.support:appcompat-v7:22.2.0
|    \--- com.android.support:support-v4:22.2.0
|         \--- com.android.support:support-annotations:22.2.0
+--- com.android.support:support-v4:22.2.0 (*)
+--- com.google.android.gms:play-services:6.1.71
|    \--- com.android.support:support-v4:20.0.0 -> 22.2.0 (*)
+--- com.crashlytics.android:crashlytics:1.+ -> 1.1.13
\--- com.jakewharton:butterknife:5.1.2
4

19 回答 19

208

确保您的应用程序处于调试版本变体中。转到Build > Select Build Variant...并应显示以下内容:

在此处输入图像描述

于 2016-05-22T06:12:53.523 回答
133

我错误地将测试类放在src/test。将它们移动到src/androidTest/java/后,依赖关系已解决。

于 2016-04-05T12:54:07.950 回答
77

好的,这是你和我的错误!

如果我们要为本地单元测试编写一段代码,我们不应该使用@RunWith(AndroidJUnit4.class),因为我们不使用 AndroidJUnit4,但我们需要 Junit4。所以我们应该写@RunWith(JUnit4.class)。当然,您的 java 测试文件在app/src/test/java/your.package.name目录下。

否则,如果(!!)我们想编写一些Android 仪器单元测试,我们应该将我们的测试 java 文件放在app/src/androidTest/java/your.package.name目录中并使用注释,如@RunWith(AndroidJUnit4.class)

于 2016-04-06T08:17:43.573 回答
38

更新

Android 测试库现在是 AndroidX 的一部分。请务必使用官方文档中的正确 Gradle 依赖项。

原始答案

我在这里发现测试支持库的版本比我使用的要新:

dependencies {
    androidTestCompile 'com.android.support.test:runner:0.5'
    androidTestCompile 'com.android.support.test:rules:0.5'
    androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
}

注意:请务必使用这些库的最新版本。这个问题来自 Android 测试支持库是新的并且这里的版本号非常过时的时候。

于 2015-06-03T18:05:26.853 回答
26

我通过在应用程序的 build.gradle 文件中进行小改动解决了这个问题。在该dependencies { ... }部分中,确保包含以下行:

debugImplementation 'com.android.support.test:runner:1.0.1'

或当时最新的任何版本(...Compile已弃用并已被替换...Implementation)。注意使用debugImplementation. Android Studio 建议用 自动包含它androidTestImplementation,但没有用。

通过查看应用程序模块的依赖项下的项目结构,我发现了如何将其从测试更改为调试,您可以在其中更改每个依赖项的范围,见下文。

项目结构

于 2018-02-11T18:28:22.837 回答
17

此问题的常见原因是添加以下依赖项时:

androidTestImplementation 'androidx.test.ext:junit:1.1.1'

如果您要使用检测测试(androidTestjava 包中的测试) ,这是一个正确的依赖项

test但是在使用上述依赖项时实现本地单元测试( java包中的测试);那么你将面临Cannot resolve symbol 'AndroidJUnit4'

这是因为androidTestImplementation指令用于在仪器测试中导入库,而不是在本地 JVM/单元测试中。

如果要AndroidJUnit4在本地 JVM/单元测试中使用,请改用以下依赖项

testImplementation 'androidx.test.ext:junit:1.1.1'

如果您在使用仪器测试时添加后一个依赖项,同样的事情也适用AndroidJUnit4,您还将获得Cannot resolve symbol 'AndroidJUnit4'; 因为你使用了错误的指令。

于 2020-03-03T20:10:53.690 回答
11

请注意,这个 OP 现在是 2019 年,已有 4 年历史,所以如果您使用的是 Android X,那么AndroidJUnit4.class它已被弃用,您会遇到一个错误,并且还有一个错误androidx.test.ext.junit.runners.AndroidJUnit4。我建议阅读此链接以解决问题。

AndroidJUnit4.class 已弃用:如何使用 androidx.test.ext.junit.runners.AndroidJUnit4?

将 Junit4 测试迁移到 androidx:是什么原因导致“无法加载委托运行程序”? 对我来说,Android Studio 建议更换

@RunWith(AndroidJUnit4.class)

已弃用

@RunWith(AndroidJUnit4ClassRunner.class)

和这个

androidx.test.ext.junit.runners.AndroidJUnit4

有了这个

import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner;

之后错误消失了,但我不知道未来的测试是否可以运行?!

于 2019-08-22T18:32:22.653 回答
8

就我而言,这有助于发布变体:

android {
    ...
    testBuildType "release" 
}
于 2018-02-17T17:02:19.833 回答
7

如果有人仍然有这个问题:

无法解析符号“AndroidJUnit4”

并使用应用程序模块中的 API 27,build.gradle添加以下行:

testImplementation 'junit:junit:4.12'

// AndroidJUnitRunner and JUnit Rules
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test:rules:1.0.2'

// Espresso dependencies
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
于 2018-04-07T22:04:00.720 回答
3

将测试类移动到 src/androidTest/java/。然后依赖将解决。

于 2019-04-24T14:16:05.587 回答
3

将此代码放在您的依赖项中

compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
})
于 2017-01-04T09:10:36.760 回答
2

在您的 build.gradle 文件中添加此依赖项:

androidTestImplementation 'androidx.test.ext:junit:1.1.1'

使用最新发布的版本更新最终版本 ( 1.1.1)。

于 2019-09-30T09:06:06.547 回答
2

如果您正在使用具有多个构建类型的项目,则必须在模块的 build.gradle 文件中使用 testBuildType 标签提及构建变体窗口中选定的构建类型。

例如:如果您使用的是构建类型调试,那么您应该添加android{testBuildType "debug" },如果使用阶段android{testBuildType "stage"}则在 android 标记中添加语句。

于 2019-03-05T19:20:31.173 回答
1

经典的Invalidate Caches/Restart帮助了我!:)

于 2019-04-24T07:20:24.870 回答
1

当我关注 Google IOSched 应用程序并使用三种构建类型 [debug、release、staging] 设置我的项目时,我也发生了同样的错误,其中 debug 和 release 共享相同的源目录

sourceSets {
    debug.java.srcDir 'src/debugRelease/java'
    release.java.srcDir 'src/debugRelease/java'
}

在这种情况下,testBuildType在您的模块级 build.gradle 文件中指定 ,项目现在应该能够解析符号“AndroidJUnit4”。

...
sourceSets {
    debug.java.srcDir 'src/debugRelease/java'
    release.java.srcDir 'src/debugRelease/java'
}

testBuildType "staging"
...

参考:https ://github.com/google/iosched/blob/master/mobile/build.gradle

于 2020-05-13T07:53:47.927 回答
0

正如答案列表所示,这可能是由几件事引起的。列表中的另一个:

我运行了一个过度热心的 LINT,它删除了所有未使用的导入。这将产生相同的错误,并且很容易忽略这就是问题所在。

Android-studio 将突出显示测试代码中缺少的引用 - 并且会出现 ALT-ENTER 弹出窗口(这是很容易错过的部分)。

接下来,我需要从 LINT 中删除测试 - 或者至少禁用此警告。

编辑:@Code-Apprentice,缺少的行是:

import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;


import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

所以文件中的第一个错误是@RunWith(AndroidJUnit4.class)在我的测试课开始时。

于 2018-10-20T02:01:17.143 回答
0

短篇小说版:

将您的 Gradle 升级到最新版本

我将在 2020 年 2 月 15 日回答这个问题。不幸的是,我已经用尽了这里和其他地方提到的所有可能的解决方案。

是的,以上都不起作用。我使用内置功能“迁移到 Andoridx”,它可能会提醒我必须升级我的目标 SDK 版本和我的 gradle 版本。在我将我的 gradle 版本从 2.0.2 升级到 3.5.3 之后。它们可以正常工作,即使是旧的导入语句也可以。

于 2020-02-15T08:01:07.367 回答
0

添加

compile com.android.support.test:runner:0.5'

为我解决了这个确切的问题。

于 2018-03-31T15:53:57.680 回答
0

确保你有

    androidTestImplementation 'androidx.test.ext:junit:1.1.1'

应用程序 build.gradle 文件中的依赖项。我错误地删除了它并且测试停止工作。

于 2020-09-12T06:54:48.467 回答