I want to use idling resources because I´m using RxJava and EventBus in my app and sometimes my tests fail (I´m thinking that is because that synchronisation).
Dependencies:
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'
Test failing:
@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 but not working:
@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)
}
}
I had the same requirement to force Espresso to being idle before I checked the state of the UI. What worked for me, is to add an always true view assertion, since Espresso waits for idle state before executing it.
onView(isRoot()).check(matches(anything()));
I know this is an old question, but I ran across this while searching and thought other people might too. This behavior is now built-in into Espresso.onIdle().
void onIdle ()
Loops the main thread until the app goes idle.
Only call this method for tests that do not interact with any UI elements, but require Espresso's main thread synchronisation! This method is mainly useful for test utilities and frameworks that are build on top of Espresso.
For UI tests use onView(Matcher) or onData(Matcher). These Apis already use Espresso's internal synchronisation mechanisms and do not require a call to onIdle().
https://developer.android.com/reference/android/support/test/espresso/Espresso#onidle
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With