43

I have spent all day setting up Junit4 instrumentation tests with Espresso, but just can't seem to get that final step. No matter what I do it won't recognize the onView() method. I have tried multiple SDK/support-lib versions and so far nothing. I have gone through all the google setup guides and many stackoverflow posts, turning here as my last hope.

Gradle version : com.android.tools.build:gradle:1.5.0

Gradle file:

apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"
    useLibrary  'org.apache.http.legacy'

    defaultConfig {
        applicationId "lv.my.android"
        minSdkVersion 9
        targetSdkVersion 22
        testApplicationId "lv.my.android.tests"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    packagingOptions {
        exclude 'LICENSE.txt'
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
    }

    compileOptions {
        sourceCompatibility = 'VERSION_1_7'
        targetCompatibility = 'VERSION_1_7'
    }

    signingConfigs {
        beta {
            storeFile file("beta.keystore")
            storePassword "betabuild"
            keyAlias "key"
            keyPassword "betabuild"
        }
        release
    }

    buildTypes {
        debug {
            debuggable true
            applicationIdSuffix '.debug'
            versionNameSuffix '-DEV'
            minifyEnabled false
        }

        beta {
            debuggable true
            applicationIdSuffix '.beta'
            versionNameSuffix '-BETA'
            signingConfig signingConfigs.beta
            minifyEnabled false
        }

        release {
            minifyEnabled false
        }
    }
}

dependencies {
    compile files('src/main/libs/guice-3.0-no_aop.jar')
    compile files('src/main/libs/javax.inject-1.jar')
    compile files('src/main/libs/roboguice-2.0.jar')
    compile files('src/main/libs/junit-4.11.jar')
    compile files('src/main/libs/hamcrest-core-1.3.jar')
    compile files('src/main/libs/GeoLib.jar')
    compile files('src/main/libs/GeoPolygons.jar')
    compile files('src/main/libs/universal-image-loader-1.9.4.jar')
    compile files('src/main/libs/javax.annotation-3.2-b06-sources.jar')
    compile 'uk.co.chrisjenx:calligraphy:2.1.0'
    compile 'com.squareup:otto:1.3.5'
    compile 'com.google.android.gms:play-services:6.5.87'
    compile 'com.android.support:support-annotations:23.0.1'
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.android.support:support-v4:23.0.1'
    compile 'com.android.support:palette-v7:23.0.1'
    compile 'com.google.code.findbugs:jsr305:2.0.1'
    compile 'com.nineoldandroids:library:2.4.0'
    compile 'pl.charmas.android:android-reactive-location:0.4@aar'
    compile 'io.reactivex:rxjava:1.0.3'
    compile files('src/main/libs/FlurryAnalytics-6.1.0.jar')
    compile 'com.github.castorflex.smoothprogressbar:library:1.1.0'



    androidTestCompile 'com.android.support.test:testing-support-lib:0.1'
    androidTestCompile'com.android.support.test:runner:0.4.1'
    // Set this dependency to use JUnit 4 rules
    androidTestCompile'com.android.support.test:rules:0.4'
    // Set this dependency to build and run Espresso tests
    androidTestCompile'com.android.support.test.espresso:espresso-core:2.2.1'
    testCompile 'junit:junit:4.12'
    testCompile "org.mockito:mockito-core:1.9.5"
}

My test (located in src/androidTest/java/lv/my/test)

package lv.my.test;

import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.LargeTest;
import lv.my.android.activities.LoginActivity;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(AndroidJUnit4.class)
@LargeTest
public class LoginActivityTest {

    private String mStringToBetyped;

    @Rule
    public ActivityTestRule<LoginActivity> mActivityRule = new ActivityTestRule<>(LoginActivity.class);

    @Before
    public void initValidString() {

    }

    @Test
    public void changeText_sameActivity() {
//        onView not recognized here

    }
}

PS. I use roboguice could that be the issue?

serv-inc
  • 35,772
  • 9
  • 166
  • 188
somerandomusername
  • 1,993
  • 4
  • 23
  • 55

5 Answers5

86

You should either use a static import:

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

or

import android.support.test.espresso.Espresso;

and call it in the following way

Espresso.onView()
Egor
  • 39,695
  • 10
  • 113
  • 130
  • 20
    Wow, it worked. None of examples or tutorials mentioned this, it just showed that it should work out of the box. So I got this working `Espresso.onView(ViewMatchers.withId(R.id.registerButton))` – somerandomusername Jan 21 '16 at 15:49
  • 4
    So why doesn't it say anything about this in here : http://developer.android.com/training/testing/ui-testing/espresso-testing.html#build – somerandomusername Jan 21 '16 at 15:51
  • 4
    am we suppose to figure that ourselves?!! non of the android documentations mention that, I don't know why – Muhammed Refaat Nov 17 '16 at 02:35
  • 2
    Below are other functions to import. Espresso.onView(ViewMatchers.withId(R.id.uname_edt)) ViewActions.typeText("aaaa") ViewActions.click()) ViewAssertions.matches(ViewMatchers.withText("bbb") ViewActions.closeSoftKeyboard() – Ashok Reddy Narra Apr 09 '19 at 09:23
20

To extend what Egor has suggested, in Android Studio, once you get red text at onView(), simply press alt+enter when the red bulb popped up. Then choose static import.

emen
  • 6,050
  • 11
  • 57
  • 94
  • 4
    +1 this works. A fascinating key stroke. I am having problem with withId as well and did just as you mentioned and it suggested to static import with `matchers.ViewMatchers`. Thanks a lot! – Neon Warge Sep 10 '16 at 13:54
8

For AndroidX use this

import androidx.test.espresso.Espresso.onView
OhhhThatVarun
  • 3,981
  • 2
  • 26
  • 49
2

Keep writing. Android Studio will suggest the needed Espresso imports, from the 'inside out'. For example: onView(withId()) First will detect withId(), then onView()

Pedro Gonzalez
  • 1,429
  • 2
  • 19
  • 30
0

If your test file is in test folder and not in androidTest, then in Gradle file in dependencies, instead of "androidTest..." use "test..." for this dependency.

Dragan N
  • 21
  • 4