无法解析符号'AndroidJUnit4'

Cod*_*ice 129 android gradle build.gradle android-uiautomator testing-support-library

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

import android.support.test.runner.AndroidJUnit4;
Run Code Online (Sandbox Code Playgroud)

当我这样做时,Android Studio突出显示runner为红色并抱怨"无法解析符号'跑步者'".

背景

我遵循Android开发者网站上的教程,使用UI Automator设置测试,从而达到了这一点.我遇到的第一个问题是,com.android.support:support-v4:22.2.0com.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'
}
Run Code Online (Sandbox Code Playgroud)

这解决了即时错误,但我怀疑它导致了我当前的问题.有没有人有任何关于如何解决这个问题的建议?

从`./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
Run Code Online (Sandbox Code Playgroud)

ori*_*ium 184

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

在此输入图像描述

  • 哇.向上投票x 100万.这是我几天来一直在寻找的答案.还找到了这个,以便您可以更改要使用的构建类型.`android {testBuildType"staging"}` (25认同)
  • 祝福你.文档从不说"这些东西只能在调试中工作".太令人沮丧了. (8认同)
  • 谢谢,你救了我 (4认同)
  • 我将不得不向Android Studio Tools团队提交错误报告.除非显式设置为"debug",否则从`debug`继承的构建类型都不起作用 (4认同)
  • 哇,我正在使用带有 initWith(buildTypes.debug) 的 cutom buildType 并且仍然失败。仅当我使用调试直接工作时! (2认同)

mik*_*kes 110

我犯了错误,把测试类放在src/test上.将它们移动到src/androidTest/java /后,依赖关系得到了解决.


Sep*_*ozi 65

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

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

如果(!!)我们想要编写一些Android Instrumented Unit Test,我们应该将我们的测试java文件放在app/src/androidTest/java/your.package.name目录中并使用注释之类的@RunWith(AndroidJUnit4.class)

  • @JohnyTex使用Maven不会影响我的答案.它只取决于您的项目文件结构. (2认同)

Cod*_*ice 32

更新

Android Test Library现在是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'
}
Run Code Online (Sandbox Code Playgroud)

注意:请务必使用这些库的最新版本.这个问题是从Android测试支持库是新的,这里的版本号已经过时了.

  • 我不知道为什么[documentation](https://developer.android.com/training/testing/integration-testing/service-testing#java)对此一无所提,除非我错过了。本来可以救我一些悲痛的。 (2认同)

ste*_*sen 23

我通过在app的build.gradle文件中进行一些小改动来解决问题.在该dependencies { ... }部分中,请确保包含以下行:

debugImplementation 'com.android.support.test:runner:1.0.1'
Run Code Online (Sandbox Code Playgroud)

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

我通过查看app模块的Dependencies下的Project Structure,找到了如何将它从测试更改为调试,您可以在其中更改每个依赖项的范围,请参阅下文.

项目结构


Zai*_*ain 15

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

androidTestImplementation 'androidx.test.ext:junit:1.1.1'
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

testImplementation 'androidx.test.ext:junit:1.1.1'
Run Code Online (Sandbox Code Playgroud)

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


And*_*off 8

就我而言,这有助于发行版本:

android {
    ...
    testBuildType "release" 
}
Run Code Online (Sandbox Code Playgroud)


tm8*_*m81 5

如果仍然有此问题:

无法解析符号“ AndroidJUnit4”

并使用API​​ 27(在build.gradleapp模块中的)中添加以下几行:

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'
Run Code Online (Sandbox Code Playgroud)


leo*_*daa 5

请注意,此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)
Run Code Online (Sandbox Code Playgroud)

已弃用

@RunWith(AndroidJUnit4ClassRunner.class)
Run Code Online (Sandbox Code Playgroud)

和这个

androidx.test.ext.junit.runners.AndroidJUnit4
Run Code Online (Sandbox Code Playgroud)

有了这个

import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner;
Run Code Online (Sandbox Code Playgroud)

之后,错误消失了,但我不知道将来运行时是否进行测试?