Android Espresso неправильно настроен или работает не стабильно?

Я выполняю тест эспрессо для Android в течение недели. Что реально - это реализовать вызов сервера и ждать его с помощью эспрессо. Это называется Idle Resourse call, и мы должны следовать правилам, которые довольно просты. На самом деле я нашел решение, но результат шокирующий - я добьюсь успеха, только если я сделаю строки комментариев

Espresso.onView(ViewMatchers.withId(R.id.email)).perform(ViewActions.typeText("some shit"));
Espresso.onView(ViewMatchers.withId(R.id.password)).perform(ViewActions.typeText("123"));

и заменив их на "хук":

final EditText email = (EditText) act.findViewById(R.id.email);
        final EditText password = (EditText) act.findViewById(R.id.password);
        getInstrumentation().runOnMainSync(new Runnable() {
            public void run() {
                email.setText("Engineer");
                password.setText("2342");
            }
        });

..перед нажатием на кнопку, которая запускает новое действие после эмулированного звонка на сервер. Это мои целые файлы: build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "shoppinglist.kizema.anton.testappespresso"
        minSdkVersion 14
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    packagingOptions {
        exclude 'LICENSE.txt'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/ASL2.0'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/DEPENDENCIES'
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'

    // App's dependencies, including test
    compile 'com.android.support:support-annotations:21.0.3'

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

LoginActivity (первая активность):

//set up initial listener
private void initLoginHelper(){
    loginHelper = new Server() {
        @Override
        public void login(String email, String code, String phone, String password, boolean loginByPhoneNumber) {
            //ask server
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            //done
            Intent intent = new Intent(LoginActivity.this, SecondActivity.class);
            startActivityForResult(intent, 0);
        }
    };
}

//onButtonClick handler
public void btnLogInSuka(View v) {
    performLogin();
}
void performLogin() {
    new Thread(new Runnable() {
        @Override
        public void run() {
                loginHelper.login(emailParam,codeParam,phoneParam,passwordParam,false);
        }
    }).start();
}

И AplicationTest.java (тесты эспрессо): @LargeTest открытый класс ApplicationTest расширяет ActivityInstrumentationTestCase2 {

public ApplicationTest() {
    super(LoginActivity.class);
}

CountingIdlingResource idleRes;

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

    idleRes = new CountingIdlingResource("server");
    Espresso.registerIdlingResources(idleRes);
}

public void testSample(){
    final LoginActivity act = (LoginActivity) getCurrentActivity();
    Server aHelper = act.getUserHelper();

    MyUserHelperExternalIdleRes helper2 = new MyUserHelperExternalIdleRes(idleRes, aHelper);
    act.setUserHelper(helper2);


    //if comment this and uncomment next two lines we receive PerformException
    final EditText email = (EditText) act.findViewById(R.id.email);
    final EditText password = (EditText) act.findViewById(R.id.password);
    getInstrumentation().runOnMainSync(new Runnable() {
        public void run() {
            email.setText("Engineer");
            password.setText("2342");
        }
    });

//        Espresso.onView(ViewMatchers.withId(R.id.email)).perform(ViewActions.typeText("some shit"));
//        Espresso.onView(ViewMatchers.withId(R.id.password)).perform(ViewActions.typeText("123"));

    Espresso.closeSoftKeyboard();
    Espresso.onView(ViewMatchers.withId(R.id.btnLogIn)).check(ViewAssertions.matches(ViewMatchers.isDisplayed()));

    Espresso.onView(ViewMatchers.withId(R.id.btnLogIn)).perform(ViewActions.click());
    Espresso.onView(ViewMatchers.withId(R.id.secondActivityOpened)).check(ViewAssertions.matches(ViewMatchers.isDisplayed()));
    Espresso.pressBack();

    Espresso.closeSoftKeyboard();
    Espresso.onView(ViewMatchers.withId(R.id.btnLogIn)).perform(ViewActions.click());
}

Activity getCurrentActivity() {
    getInstrumentation().waitForIdleSync();
    final Activity[] activity = new Activity[1];
    try {
        runTestOnUiThread(new Runnable() {
            @Override
            public void run() {
                java.util.Collection<Activity> activites = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED);
                activity[0] = Iterables.getOnlyElement(activites);
            }});
    } catch (Throwable throwable) {
        throwable.printStackTrace();
    }
    return activity[0];
}

class MyUserHelperExternalIdleRes implements Server {
    private Server aHelper;
    private CountingIdlingResource udleRes;

    public MyUserHelperExternalIdleRes(CountingIdlingResource udleRes, Server aHelper) {
        this.aHelper = aHelper;
        this.udleRes = udleRes;
    }

    @Override
    public void login(String email, String code, String phone, String password, boolean loginByPhoneNumber) {

        udleRes.increment();
        try {
            aHelper.login(email,code, phone,password,loginByPhoneNumber);
        } finally {
            udleRes.decrement();
        }
    }
}

}

Итак, если мы делаем на самом деле базовую операцию эспрессо: Espresso.onView (ViewMatchers.withId (R.id.password)). Execute (ViewActions.typeText ("123"));

Получаем PerformException: не можем найти кнопку по id. Если мы сделаем хук (с установкой Runnable в потоке пользовательского интерфейса), мы получим это простое демо. В моем основном приложении есть другие баги с эспрессо (вышеописанное «хак» не сработало, мы получаем ту же мистку). Наверняка у меня есть какая-то очень хитрая ошибка, я предполагаю, что что-то с настройками проекта (эспрессо) неверно - я слишком плох с gradle. Пожалуйста, помогите мне с этим, или предоставьте ссылку на пример приложения для Android Studio с тестами эспрессо (я не нашел ни одного, все приложения плохо настроены (без gradle), и после импорта их в Android Studio я не могу запустить их с

gradlew connectedAndroidTest

Ответы на вопрос(1)

Ваш ответ на вопрос