无法解析符号“ AndroidJUnit4”


139

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

import android.support.test.runner.AndroidJUnit4;

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

背景

通过遵循Android Developer网站上的教程使用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

这表明您的构建完全丢失com.android.support.test:runner。您能否通过更改确认gradle dependencies是否仍在继续使用resolutionStrategy
CommonsWare 2015年

@CommonsWare将依赖性输出添加到我的问题中。我不知道(*)之后的意思com.android.support.test:runner:0.2
法学徒

根据Gradle人士的说法,星号“表示此时依赖关系图的树状视图已被剪短,因为该关系图的那一部分已经在前面列出了”。我很困惑为什么这对您不起作用。
CommonsWare 2015年

1
请注意,@ stemadsen从2018年以来的答案可能比其他答案更相关。曾经有人写过一个测试,该测试每年都保持相同的问题,但是答案却变了……
Roy Falk

Answers:


197

确保您的应用处于调试版本。转到Build>选择Build Variant ...,然后应显示以下内容:

在此处输入图片说明


5
谢谢,您救了我
沙发,

10
祝福你。该文档从未声明“这些东西只能在调试中使用”。真令人沮丧
Chantell Osejo

26
哇。投票数x 100万。这是我几天来一直在寻找的答案。还发现了这一点,因此您可以更改要使用的构建类型。android { testBuildType "staging"}
WIllJBD

5
我将不得不为此向Android Studio工具团队提交错误报告。debug除非显式设置为“调试”,否则即使继承自的构建类型也无法使用
Gautham C.16.18.16

1
哇,我正在使用带有initWith(buildTypes.debug)的cutsom buildType,但仍然失败。仅且仅当我使用调试直接有效时!
Karoly

119

我将测试类放在src / test时出错了。将它们移至src / androidTest / java /后,相关性已解决。


就我而言,由于某种原因,我的测试文件夹为src / test,然后我不得不将其重命名为src / androidTest,并在3小时后解决了我的问题...
Teo Inke

69

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

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


我正在使用Maven,然后呢?
JohnyTex

2
@JohnyTex使用Maven不会影响我的回答。它仅取决于您的项目文件结构。
Sepehr Behroozi

34

更新资料

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测试支持库是新的,并且这里的版本号已经过时。


3
我不知道为什么 文档会对此一无所提,除非我错过了。本来可以救我一些悲痛的。
Nom1fan

@Karoly我还是有问题。您找到解决方案了吗?
Mahdi

26

我通过对应用程序的build.gradle文件进行一些小的更改来解决了该问题。在该dependencies { ... }部分中,确保包括以下行:

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

或当时最新的版本(...Compile已弃用,并已由代替...Implementation)。注意的使用debugImplementation。Android Studio建议使用对其进行自动添加androidTestImplementation,但该方法无效。

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

项目结构


请注意,这会将测试支持库编译为APK。
法学徒'18年

另外随着testImplementation作品“:规则:com.android.support.test 1.0.2”
普拉特

10

请注意,此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;

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


@ Code-Apprentice-非常感谢您的编辑,现在更好了
leonidaa

8

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

android {
    ...
    testBuildType "release" 
}

您能否提供更完整的解决方案。我不了解您所做的工作。
法学徒'18

当我将构建变体更改为“发行版”时,在浓缩咖啡测试中遇到了“无法解析符号'AndroidJUnit4'”问题。一旦将此语句(testBuildType“ release”)添加到应用程序级别的build.gradle(摘自developer.android.com/studio/test/index.html#add_a_new_test),此问题就消失了。
Andrew Glukhoff

我格式化了您的答案中的代码。您应该添加更多详细信息,例如评论中的链接,并描述此块在项目中的位置。
法学徒'18

7

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

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';因为您使用了错误的指令。


1
在我最初提出的问题中,我正在运行仪器化测试。但是,这是一个很大的区别,希望将来能帮助访问者解决此问题。
Code-Apprentice

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'

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

1
当我写这个问题时,我还没有添加espresso作为单元测试的依赖项。
法学徒

+1实际上是在我看到这个之前就已经弄清楚了,但是是的,这就是我所做的,它解决了我的问题。
Tony D

2
请从@sepehr遵循以下两个答案。espresso包中未包含AndroidJunit4类,而是将其存在于android.support.test.runner包中。所有您需要做的就是@Runwith(AndroidJunit4.class)写在上面/针对src / Androidtest / java中存在的测试用例,INSTED OF包括在src / test / java下编写的测试用例中。

2

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

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


如果要切换要测试的变体,是否建议编辑构建文件?
nasch



1

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

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

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


0

新增中

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

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


已经在接受的答案中说明了这一点。您还应该查看是否有更新的版本,并使用它来代替。
法学徒'18

androidTestCompile和compile一样吗?
donlys'Apr

compile指令命名主应用程序中androidTestComiple使用的依赖关系,而命名依赖项用于测试。所以正确的答案是使用androidTestCompile,而不是compile
法学徒'18年

0

如答案列表所示,这可能是由一些原因引起的。该列表还有一个:

我跑得太热心了,它删除了所有未使用的进口商品。这将产生相同的错误,并且很容易错过这是问题所在。

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)在我的测试课开始时出现的。


您可以举一个例子来说明这种情况吗?
法典学徒'18

0

短篇小说版本:

将您的Gradle升级到最新版本

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

是的,以上这些都没有。我使用内置功能“迁移到Andoridx”,这可能提醒我必须升级目标SDK版本和gradle版本。我将gradle版本从2.0.2升级到3.5.3之后。它们只是起作用,即使旧的import语句也起作用。


嗨,这是一个老问题,已经有一个可接受的答案,我看不到您的答案如何为问题添加了新内容。如果您的答案未对现有答案添加任何新内容,请避免回答。谢谢
hippozhipos

接受的答案提供了一个链接,用于将测试依赖项更新到AndroidX测试库。这很可能是您尝试过的所有事情中都解决了这一问题的原因。
代码学徒

0

当我遵循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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.