2015-10-06 5 views
0

Я хочу использовать ресурсы на холостом ходу, потому что я использую RxJava и EventBus в своем приложении, а иногда мои тесты терпят неудачу (я думаю, что это потому, что эта синхронизация).Как заставить assert ждать IdlingResource для утверждения

Зависимости:

androidTestCompile 'com.android.support.test:runner:0.4' 
androidTestCompile 'com.android.support.test:rules:0.4' 
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1' 
androidTestCompile 'com.android.support.test.espresso:espresso-intents:2.2.1' 
androidTestCompile('com.android.support.test.espresso:espresso-contrib:2.2.1') { 
    exclude group: 'com.android.support', module: 'appcompat' 
    exclude group: 'com.android.support', module: 'support-v4' 
    exclude module: 'recyclerview-v7' 
} 
androidTestCompile 'junit:junit:4.12' 
androidTestCompile 'com.squareup.retrofit:retrofit-mock:1.9.0' 
androidTestCompile 'com.squareup.assertj:assertj-android:1.1.0' 
androidTestCompile 'com.squareup.spoon:spoon-client:1.2.0' 

Тестовые неудачу:

@RunWith(AndroidJUnit4.class) 
@SmallTest 
public class PushNotificationTests { 

    @Test 
    public void testSomething(){ 

     // do things... 
     MyIdlingResource eventBusIdlingResource = new MyIdlingResource(); 
     registerIdlingResources(eventBusIdlingResource); 

     Order.Status status = Order.getCurrentObservable().toBlocking().first().getStatus(); 
     assertThat(status).isEqualTo(Order.Status.PROGRESS); // Fail, 

     unregisterIdlingResources(eventBusIdlingResource) 
    } 

} 

Try, но не работает:

@RunWith(AndroidJUnit4.class) 
@SmallTest 
public class PushNotificationTests { 

    @Test 
    public void testSomething(){ 

     // do things... 

     MyIdlingResource eventBusIdlingResource = new MyIdlingResource(); 
     registerIdlingResources(eventBusIdlingResource); 

     // Wait manually? 
     int sleeps = 0; 
     while(!eventBusIdlingResource.isIdleNow() || sleeps < 10){ 
      sleep(100); 
      sleeps++; 
     } 

     Order.Status status = Order.getCurrentObservable().toBlocking().first().getStatus(); 
     assertThat(status).isEqualTo(Order.Status.PROGRESS); // Fail, 

     unregisterIdlingResources(eventBusIdlingResource) 
    } 

} 

ответ

0

Концевые до герметизирующего метод сна внутри класса.

import android.support.test.espresso.IdlingResource; 

/** 
* Have functions to sleep the processor because assertions are not linked to 
* {@link IdlingResource} to do assertions, so should be used before asserts if there's an 
* idle process. 
*/ 
public class IdlingResourceSleeper { 

    private static final int SLEEPS_LIMIT = 50; 
    private static final int SLEEPS_TIME = 10; 

    /** 
    * Used to sleep {@link IdlingResourceSleeper#SLEEPS_LIMIT} times and 
    * {@link IdlingResourceSleeper#SLEEPS_TIME} ms until idlingResource.isIdleNow() is false. 
    * 
    * @param idlingResource 
    */ 
    public static void sleep(IdlingResource idlingResource) { 
     int sleeps = 0; 
     while (!idlingResource.isIdleNow() || sleeps < SLEEPS_LIMIT) { 
      android.os.SystemClock.sleep(SLEEPS_TIME); 
      sleeps++; 
     } 

    } 
} 

источники: - gist - post

1

У меня было такое же требование, чтобы заставить Эспрессо, чтобы быть неактивным до Я проверил состояние интерфейса. То, что сработало для меня, заключается в том, чтобы добавить утверждение всегда истинного представления, поскольку Espresso ждет незанятого состояния перед его исполнением.

onView(isRoot()).check(matches(anything())); 
Смежные вопросы