【问题标题】:Cannot resolve symbol 'AndroidJUnit4'无法解析符号“AndroidJUnit4”
【发布时间】:2015-08-16 16:23:12
【问题描述】:

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

import android.support.test.runner.AndroidJUnit4;

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

背景

我是通过遵循 Android 开发者网站上的 setting up tests using UI Automator 教程来达到这一点的。我遇到的第一个问题是com.android.support:support-v4:22.2.0com.android.support.test:runner:0.2 依赖于不同版本的com.android.support:support-annotations。我遵循了this Android bug report 的建议,并将以下内容添加到我项目的build.gradle 中的allprojects

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 在我的问题中添加了依赖项输出。我不知道(*)后面的com.android.support.test:runner:0.2是什么意思。
  • 根据the Gradle folks,星号“表示依赖关系图的树形视图在这一点上被缩短了,因为图的那部分已经在前面列出了。”我很困惑为什么这对你不起作用。
  • 请注意,@stemadsen 2018 年的回答可能比其他人更相关。有人曾经写过一个测试,它年复一年地保持相同的问题,但答案却改变了......

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


【解决方案1】:

确保你有

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

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

【讨论】:

    【解决方案2】:

    当我关注 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

    【讨论】:

    • 我使用 testBuildType "staging" 解决了我的错误
    【解决方案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';因为你使用了错误的指令。

    【讨论】:

    • 在我最初问题的场景中,我正在运行检测测试。但是,这是一个很大的区别,希望将来能帮助访问者解决这个问题。
    【解决方案4】:

    短篇小说版:

    将您的 Gradle 升级到最新版本

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

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

    【讨论】:

    • 嗨,这是一个老问题已经有一个公认的答案,我看不出你的答案如何为问题添加任何新内容。如果您的答案没有为现有答案添加任何新内容,请避免回答。谢谢
    • 接受的答案提供了将测试依赖项更新到 AndroidX 测试库的链接。这很可能是您尝试过的所有事情中解决问题的原因。
    【解决方案5】:

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

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

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

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

      • @Code-Apprentice - 非常感谢您的编辑,现在好多了
      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

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

        【讨论】:

          【解决方案9】:

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

          例如:如果你使用构建类型debug,那么你应该添加android{testBuildType "debug" },如果使用stage,那么你应该在android标签中添加android{testBuildType "stage"}声明。

          【讨论】:

          • 如果要切换正在测试的变体,您是否建议编辑构建文件?
          【解决方案10】:

          更新

          Android 测试库现在是 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 测试支持库是新的并且这里的版本号非常过时的时候提出的。

          【讨论】:

          • 我想知道为什么documentation 没有提及此问题,除非我错过了。会为我节省一些悲伤。
          • @Karoly 我还是有问题。你找到解决办法了吗?
          • 答案中链接的官方文档没有列出所需的 gradle 依赖项。幸运的是,Migrate to AndroidX 工具能够将答案中的依赖项转换为:dependencies { androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test:rules:1.1.1' androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0' }
          • @user2623008 这个答案是在 androidx 命名空间创建之前写的。感谢您的更新。
          【解决方案11】:

          如果还有人遇到这个问题:

          无法解析符号“AndroidJUnit4”

          并使用 API 27,在 app 模块中的 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'
          

          【讨论】:

            【解决方案12】:

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

            我运行了一个过度热心的 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) 在我的测试课程的开头。

            【讨论】:

            • 您能否展示一个发生这种情况的示例测试?
            【解决方案13】:

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

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

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

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

            【讨论】:

            • 请注意,这会将测试支持库编译到 APK 中。
            • 也适用于 testImplementation "com.android.support.test:rules:1.0.2"
            【解决方案14】:

            添加

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

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

            【讨论】:

            • 这已在接受的答案中说明。您还应该查看是否有更新的版本并改用它。
            • androidTestCompile和compile一样吗?
            • compile 指示主应用程序中使用的依赖项,而androidTestComiple 命名用于测试的依赖项。所以正确的答案是使用androidTestCompile,而不是compile
            【解决方案15】:

            在我的情况下,这有助于发布变体:

            android {
                ...
                testBuildType "release" 
            }
            

            【讨论】:

            • 能否给出更完整的解决方案。我不明白你所做的事情的背景。
            • 当我将构建变体更改为“发布”时,我在 espresso 测试中遇到了“无法解析符号 'AndroidJUnit4'”问题。一旦我将此语句(testBuildType“release”)添加到应用程序级 build.gradle(取自developer.android.com/studio/test/index.html#add_a_new_test),这个问题就消失了。
            • 我将您的答案格式化为您答案中的代码。您应该添加更多详细信息,例如评论中的链接并描述此块在您的项目中的位置。
            【解决方案16】:

            确保您的应用处于调试版本。转到 Build > Select Build Variant... 应该会出现以下内容:

            【讨论】:

            • 谢谢,你救了我
            • 祝福你。文档从来没有说“这些东西只能在调试中工作”。太令人沮丧了。
            • 哇。投票 x 100 万。这是我几天来一直在寻找的答案。还发现了这个,因此您可以更改要使用的构建类型。 android { testBuildType "staging"}
            • 我将不得不为此向 Android Studio 工具团队提交错误报告。即使是从debug 继承的构建类型也不起作用,除非明确设置为“调试”
            • 哇,我正在使用带有 initWith(buildTypes.debug) 的 cutsom buildType,但仍然失败。只有当我直接使用调试时才有效!
            【解决方案17】:

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

            【讨论】:

            • 在我的情况下,由于某种原因,我的测试文件夹是 src/test,然后我不得不将其重命名为 src/androidTest 并在 3 小时后解决了我的问题...
            【解决方案18】:

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

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

            【讨论】:

            • 当我写这个问题时,我还没有添加 espresso 作为单元测试的依赖项。
            • +1 实际上我在看到这个之前就想通了,但是是的,这就是我所做的,它解决了我的问题。
            • 遵循@sepehr 的以下两个答案。 AndroidJunit4 类不在 espresso 包中,它存在于 android.support.test.runner 包中。你所要做的就是在上面写上@Runwith(AndroidJunit4.class)/用于 src/Androidtest/java 中存在的测试用例,INSTED OF 包括在 src/test/java 下编写的测试用例。
            【解决方案19】:

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

            如果我们要为Local Unit Testing 编写一段代码,我们不应该使用@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 Using Maven 不会影响我的回答。它仅取决于您的项目文件结构。
            猜你喜欢
            • 2017-09-06
            • 2015-11-17
            • 2018-11-27
            • 2016-09-29
            • 2018-11-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多