无法解析符号' AndroidJUnit4'

时间:2015-06-02 18:10:26

标签: android gradle build.gradle android-uiautomator testing-support-library

显然我需要正确的导入语句来解决这个问题。根据{{​​3}},这应该是

import android.support.test.runner.AndroidJUnit4;

当我这样做时,Android Studio以红色突出显示runner并投诉"无法解析符号' runner'"。

背景

我按照Android开发人员网站上docs for AndroidJUnit4的教程了解了这一点。我遇到的第一个问题是com.android.support:support-v4:22.2.0com.android.support.test:runner:0.2依赖于com.android.support:support-annotations的不同版本。我按照setting up tests using UI Automator中的建议进行了操作,并将以下内容添加到我的项目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

19 个答案:

答案 0 :(得分:171)

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

enter image description here

答案 1 :(得分:102)

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

答案 2 :(得分:62)

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

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

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

答案 3 :(得分:30)

<强>更新

Android Test Library现在是AndroidX的一部分。请务必使用official documentation中找到的正确Gradle依赖项。

原始答案

我发现here测试支持库的版本比我使用的版本更新:

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

答案 4 :(得分:22)

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

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

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

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

Project structure

答案 5 :(得分:8)

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

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

答案 6 :(得分:7)

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

android {
    ...
    testBuildType "release" 
}

答案 7 :(得分:5)

请注意,此OP现已发布于2019年,已有4年的历史了,因此如果您使用的是Android X,则不推荐使用AndroidJUnit4.class,则该位置有一个错误,另外一个与此androidx.test.ext.junit.runners.AndroidJUnit4相关的错误。我建议阅读此链接以解决问题。

AndroidJUnit4.class is deprecated: How to use androidx.test.ext.junit.runners.AndroidJUnit4?

Migrating Junit4 tests to androidx: What causes 'delegate runner could not be loaded'? 对我来说,Android Studio建议替换

@RunWith(AndroidJUnit4.class)

已被

弃用
@RunWith(AndroidJUnit4ClassRunner.class)

还有这个

androidx.test.ext.junit.runners.AndroidJUnit4

与此

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

此后错误消失了,但是我不知道将来运行时是否可以正常运行?!

答案 8 :(得分:4)

如果还有人遇到此问题:

  

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

答案 9 :(得分: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'
})

答案 10 :(得分:1)

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

例如:如果您使用的是构建类型 debug ,则应添加android{testBuildType "debug" },如果使用 stage ,则应在其中添加android{testBuildType "stage"}语句android标签。

答案 11 :(得分:1)

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

答案 12 :(得分:0)

确保您拥有

    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
您的应用程序build.gradle文件中的

依赖项。我误删了它,测试停止了。

答案 13 :(得分:0)

当我遵循Google IOSched应​​用程序并使用三种构建类型[debug,release,staging]设置项目时,发生了相同的错误,其中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

答案 14 :(得分:0)

短篇小说版本:

将Gradle升级到最新版本

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

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

答案 15 :(得分:0)

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

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

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

答案 16 :(得分:0)

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

答案 17 :(得分: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)

答案 18 :(得分:0)

添加

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

为我解决了这个问题。