无法解析符号“ AndroidJUnit4”

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

import android.support.test.runner.AndroidJUnit4;

当我这样做时,Android Studio 突出显示了红色的 runner,并抱怨“无法解析符号‘ runner’”。

背景资料

我是通过遵循针对 使用 UI 自动化设置测试的 Android Developer 站点上的教程来了解这一点的。我遇到的第一个问题是 com.android.support:support-v4:22.2.0com.android.support.test:runner:0.2依赖于 com.android.support:support-annotations的不同版本。我按照 这个 Android 错误报告的建议,在我的项目的 build.gradle中对 allprojects增加了以下内容:

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

这解决了立即出现的错误,但我怀疑它导致了我目前的问题。有人对如何解决这个问题有什么建议吗?

来自‘ ./gradlew: app: Dependences 的相关事件部分

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
78966 次浏览

更新

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 测试支持库刚出现的时候,这里的版本号已经过时了。

我犯了一个错误,把测试类放在了 Src/test上。在把它们移动到 Src/androidTest/java/之后,依赖关系得到了解决。

好吧,这是你的错误,也是我的错误!

如果我们要为 本地单位测试编写一段代码,我们不应该使用 @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)

确保你的应用程序在调试版本变体。转到 Build > Select Build Variant...和以下应该显示:

enter image description here

将此代码放入依赖项中

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'
})

我通过对应用程序的 build.gradle 文件做一个小小的更改来解决这个问题。在 dependencies { ... }部分,请务必包括以下内容:

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

或任何版本是最新的,在这一点上(...Compile是不推荐的,已被取代的 ...Implementation)。使用 debugImplementation。Android 工作室建议使用自动模式——包含在 androidTestImplementation中,但是没有成功。

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

Project structure

在我的案例中,这有助于发布变体:

android {
...
testBuildType "release"
}

添加

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

帮我解决了这个问题。

如果还有人有这个问题:

无法解析符号“ 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'

正如答案清单所示,这可能是由几个因素造成的。清单中还有一个:

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

Android 工作室将突出显示测试代码中缺少的引用-并且将出现 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)

如果您正在使用具有多个构建类型的 project,那么构建变量窗口中选择的构建类型必须在模块的 build.gradle 文件中用 testBuildType 标记提及。

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

经典的 无效缓存/重新启动帮助了我! :)

将测试类移动到 src/androidTest/java/。

请注意,这个 OP 现在是2019年,4岁,所以如果你使用 Android X,那么 AndroidJUnit4.class是不推荐的,你有一个错误,这个 androidx.test.ext.junit.runners.AndroidJUnit4还有一个错误。我建议阅读这个链接来解决这个问题。

不推荐使用 AndroidJUnit4.class: 如何使用 androidx.test.ext.junit.runner. AndroidJUnit4?

将 Junit4测试迁移到 androidx: 是什么原因导致委托运行器无法加载? 对我来说,安卓工作室建议更换

@RunWith(AndroidJUnit4.class)

这是不赞成的

@RunWith(AndroidJUnit4ClassRunner.class)

还有这个

androidx.test.ext.junit.runners.AndroidJUnit4

用这个

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

之后,错误消失了,但是我不知道将来的测试在运行时是否正常? !

在 build.gradle 文件中添加这个依赖项:

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

用最新版本更新最终版本(1.1.1)。

短篇小说版本:

升级到最新版本

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

是的,上面这些都不管用。我使用内置函数“迁移到 Andoridx”,它可能会提醒我必须升级我的目标 SDK 版本和我的分级版本。在我把我的等级版本从2.0.2升级到3.5.3之后。它们很管用,连旧的导入语句都管用。

这个问题的共同原因是,当添加以下依赖项时:

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

如果您打算使用检测测试(androidTest java 包中的测试) ,那么这是一个正确的依赖项

但是如果在使用上面提到的依赖项时实现本地单元测试(在 test java 包中测试) ,那么您将面临 Cannot resolve symbol 'AndroidJUnit4'

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

如果希望在本地 JVM/单元测试中使用 AndroidJUnit4,那么可以使用以下依赖项

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

如果在检测测试中使用 AndroidJUnit4时添加后一个依赖项,也会得到 Cannot resolve symbol 'AndroidJUnit4'; 因为您使用了错误的指令。

同样的错误也发生在我身上,当我使用 Google IOSched 应用程序并且使用三种构建类型[ debug,release,stage ]来设置我的项目时,debug 和 release 共享同一个源目录

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

在这种情况下,在模块级 build.gradle 文件中指定 testBuildType,项目现在应该能够解析符号“ 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

确保你有

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

在你的 app build.gradle 文件中的依赖项。我错误地删除了它,测试停止工作了。