2015-10-06 74 views
0

我想使用空闲资源,因为我在我的应用程序中使用RxJava和EventBus,有时我的测试失败(我认为这是因为同步)。如何使断言等待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) 
    } 

} 

尝试,但不工作:

@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

我有同样的要求,迫使咖啡到被闲置之前,我检查了UI的状态。对我来说有效的是添加一个总是真正的视图断言,因为Espresso在执行之前等待空闲状态。

onView(isRoot()).check(matches(anything()));