Android Studio无法识别Espresso类。

24

我正在使用 Gradle 1.11Android Studio 0.5.0。我尝试从com.jakewharton.espresso:espresso:1.1-r2安装Espresso库。但是在项目同步后,AS无法识别Espresso类。因此,每次我尝试在androidTest文件夹中导入import static com.google.android.apps.common.testing.ui.espresso.Espresso.onView;时,它都会将其标记为无效。

这是我的build.gradle:

apply plugin: 'android'

android {
    compileSdkVersion 19
    buildToolsVersion '19.0.2'

    defaultConfig {
        minSdkVersion 14

        targetSdkVersion 19
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner"
    }

    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}

dependencies {
    compile 'com.squareup.dagger:dagger-compiler:1.2.1'
    compile 'com.squareup.dagger:dagger:1.2.1'

    androidTestCompile ('com.jakewharton.espresso:espresso:1.1-r2') {
        exclude group: 'com.squareup.dagger'
    }
}

外部库:

外部库


你把instrumentTest文件夹改名为androidTest了吗? - Gabriele Mariotti
9个回答

28

这基本上是Android Studio的一个错误(我猜测)。

参考:

  1. 在adt-dev组中提出的问题
  2. 实际的错误 - #66841

解决方法(在修复该错误之前):

在您的gradle文件中添加一个重复的provided依赖项,如下所示:

dependencies {
    // ...

    provided 'com.jakewharton.espresso:espresso:1.1-r2'
    androidTestCompile ('com.jakewharton.espresso:espresso:1.1-r2') {
        exclude group: 'com.squareup.dagger'
    }
}

иҝҷдёӘи§ЈеҶіж–№жі•зңҹзҡ„еҫҲжңүз”ЁгҖӮжҲ‘дҪҝз”ЁеҸҢеҖҚжө“зј©е’–е•Ўзҡ„r3зүҲжң¬пјҢиҝҷдёӘbugд»Қ然еӯҳеңЁгҖӮжӯӨеӨ–пјҢжІЎжңүеҝ…иҰҒеҲӣе»әandroidTestж–Ү件еӨ№ - жҲ‘еҲӣе»әдәҶtest/java/...пјҢе®ғеҸҜд»Ҙе®ҢзҫҺең°е·ҘдҪң ;) - mmBs
1
自从Gradle Android插件版本1.1以后,aar依赖项在使用上出现了问题。原因是它不允许提供aar依赖项。 - Patrick Boos
警告:项目app:提供的依赖项只能是jar包。com.android.support.test.espresso:espresso-core:aar:2.0是一个Android库。 - Korniltsev Anatoly

13

这个问题让我很疯狂,而且似乎是Android Studio中已知的一个错误。在我的情况下,当我将构建类型从Release更改为父应用程序的Debug时,问题得到了解决。希望这对某些人有所帮助。


1
你是我的神!我希望我能过去给你一个拥抱。这也让我疯狂了三天了。谢谢,伙计。 - Dheeraj Bhaskar
我也需要重新构建一下,才能让它再次工作。(构建 --> “重新构建项目”)虽然这可能是因为我使用了Dagger并已经进行了清理。 - Ciske
谢谢。谢谢。这么愚蠢的东西怎么会引起这么多麻烦呢? - 365SplendidSuns

11

Espresso 2.0

最近发布了Espresso 2.0,现在成为了Android Support Library的一部分。这个消息是在android dev博客上宣布的

设置指南

同时他们还链接了一个更新的设置指南。你可以在那里找到从零开始配置或更新现有的espresso 2.0配置的说明。

其他提示

以上两个链接包含了所需的所有信息。如果不够,我列出了一些常见错误。

升级Android Studio至1.0.*

首先升级你的Android Studio构建版本。你应该能够从稳定版本渠道(=默认)得到至少1.0版本。所以只需使用菜单选项Android Studio > 检查更新...

要获取最新的版本,你也可以进入偏好设置,搜索更新并将渠道更改为canary channel

将Android Support Library更新至v11+

Espresso从11版本开始包含在Support library中,所以你必须获取至少该版本。使用Android SDK Manager检查更新。Support Library位于底部的Extras树中。

新依赖和命名空间

如果从旧版Espresso升级,你需要更新依赖和命名空间。对于新项目,只需将它们添加到build.gradle文件中的dependencies中即可。

dependencies {
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.0'
    androidTestCompile 'com.android.support.test:testing-support-lib:0.1'
}

由于命名空间发生了变化,您需要更新所有的导入:

android.support.test.espresso

请注意,使用静态导入更加容易。以下是一些常用的导入示例:
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
import static android.support.test.espresso.matcher.ViewMatchers.withContentDescription;

对于断言,使用 Hamcrest,以下是一些例子:

import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.anyOf;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.startsWith;
import static org.hamcrest.Matchers.endsWith;
import static org.hamcrest.Matchers.equalToIgnoringCase;
import static org.hamcrest.Matchers.equalToIgnoringWhiteSpace;

测试执行器

测试执行器需要在build.gradle文件中的defaultConfig和从Android Studio启动测试时使用的运行配置中进行配置。

defaultConfig {
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}

在您的运行配置中,将以下内容用作检测运行器(仅使用完整类名):

android.support.test.runner.AndroidJUnitRunner

示例测试用例

最后一个示例测试用例。请注意,MainActivity 是您想要测试的活动。测试本身是以 test 开头的公共方法,例如下面示例中的 testListGoesOverTheFold

@LargeTest
public class HelloWorldEspressoTest extends ActivityInstrumentationTestCase2<MainActivity> {

    public HelloWorldEspressoTest() {
            super(MainActivity.class);
        }

    @Override
    public void setUp() throws Exception {
        super.setUp();
        getActivity();
    }

    public void testListGoesOverTheFold() {
        onView(withText("Hello world")).check(isDisplayed());
    }
}

了解有关编写测试的更多信息,请访问Espresso入门指南


4
六个月过去了,这仍然是个问题,原回复者提到的错误已重新打开:https://code.google.com/p/android/issues/detail?id=66841 并得到了更高的优先级。我还没有能让Android Studio识别Espresso类,并且在依赖方面使用“provided”范围不能解决我的问题。(使用AS 0.8.6和Gradle 0.12.2)

有趣。 "provided" 依赖项肯定应该可以工作。它不是理想的,但可以使用。我怀疑您可能面临的是另一个问题。是否使用离线模式或其他什么? - KG -
尝试按照答案中提到的将发布类型更改为调试。 - Dheeraj Bhaskar

3

在我的情况下,Android Studio 1.5.1没有意识到onView()onData()方法。我只需静态导入Espresso类及其所有方法。

我添加了以下代码行,一切都完美地运行了。

import static android.support.test.espresso.Espresso.*;

3
根据http://tools.android.com/tech-docs/new-build-system/user-guide,默认情况下只测试一种构建类型,即调试 Build Type。因此,请确保您正在使用调试构建变体并重新构建应用程序。在其他构建类型中,您的所有 androidTest 依赖项都将不可见。如果您需要测试当前的构建类型,可以执行以下操作:android {…testBuildType“staging”}

非常感谢!这正是我的问题,我没有使用调试,而是使用自己的自定义构建类型,我们需要指定要使用哪个。 - Kerwan
2
谷歌搞什么鬼?真的吗?为什么名字如此重要?难道你不能从IDE中选择当前所选的构建类型。浪费了我2天的时间才弄清楚,即使没有这种构建类型,在Android Studio(从构建变量选择器中)应选择确切名称为“debug”的构建变体。在具有不同名称的构建类型中设置“debuggable”标志无效。如果您已经为构建类型定义了构建配置变量,则必须创建一个名为“debug”的构建类型,并在“debug”构建类型中重新定义所有这些变量。 - Javad

1

可以尝试使用以下依赖:

implementation 'com.android.support.test.espresso:espresso-contrib:3.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

我遇到了这个问题,我查阅了所有可以添加到我的gradle文件中的espresso库。等待黄色灯泡出现,然后点击添加库并搜索你没有的espresso库。我不知道这是否适用于每个人,但对我有效。


1

你没有具体说明看到错误的源文件是哪一个,但根据我的测试,我认为你正在尝试从其中一个主应用程序类(位于 src/main/java/ 内)访问 Espresso 类。如果是这样,那么无法正常工作,因为你已经通过 androidTestCompile 依赖项将 Espresso 包含进来,这使它仅对测试类可用,这些类必须在 src/androidTest/java 下。


1
很抱歉没有提到,但我实际上尝试在androidTest文件夹的类中访问它。 - midnight

1
我尝试了上面大家猜测的每一种解决方案,但仍然遇到了类找不到的错误。
我找到了解决方法,它救了我的一天。因此,如果你在Studio中打开左侧的项目标签,并检查构建变体,你会发现你的项目被设置为单元测试。你需要重新设置为Android Instrumentation Tests,并确保你的test.java文件位于**src\androidTest\java**下。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接