2015-05-10 2 views
13

В моем тестовом примере мне нужно записывать 1 час, в robotium solo.sleep (600000) выполнил мою работу, но в эспрессо меня путают с концепцией IdlingResource. Я должен начать запись и подождать некоторое время (в зависимости от типа испытаний) 15mins, 60mins и т.д.Эспрессо, как подождать некоторое время (1 час)?

Эквивалентный код в Robotium

solo.clickOnView(solo.getView("start_record")); 
    solo.sleep(duration * 60 * 1000); 
    solo.clickOnView(solo.getView("stop_record")); 

Я пытался использовать его как это эспрессо

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

private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME = "com.absd.rec.RecorderActivity"; 
private static Class<?> launcherActivityClass; 
private Solo solo; 
private static CoreRecordingTest skyroTestRunner; 


private static Class<? extends Activity> activityClass; 

static { 
    try { 
     activityClass = (Class<? extends Activity>) Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME); 
    } catch (ClassNotFoundException e) { 
     throw new RuntimeException(e); 
    } 
} 

@Rule 
public final ActivityTestRule<?> activityRule 
     = new ActivityTestRule<>(activityClass); 

private IntentServiceIdlingResource idlingResource; 

@Before 
public void registerIntentServiceIdlingResource() { 
    Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); 
    idlingResource = new IntentServiceIdlingResource(instrumentation.getTargetContext()); 
    Espresso.registerIdlingResources(idlingResource); 
} 

@After 
public void unregisterIntentServiceIdlingResource() { 
    Espresso.unregisterIdlingResources(idlingResource); 
} 

@Test 
public void testHello() throws Exception { 

onView(withId(AaEspressoTest.getId("recorderpage_record"))).perform(click()); 

    registerIntentServiceIdlingResource(); 

    onView(withId(AaEspressoTest.getId("recorderpage_stop"))).perform(click()); 

    } 
} 

Idling ресурс

public class IntentServiceIdlingResource implements IdlingResource { 
private final Context context; 
private ResourceCallback resourceCallback; 
public static boolean status = false; 

public IntentServiceIdlingResource(Context context) { 
    this.context = context; 
} 

@Override 
public String getName() { 
    return IntentServiceIdlingResource.class.getName(); 
} 

@Override 
public boolean isIdleNow() { 
    return getTimer(); 
} 

@Override 
public void registerIdleTransitionCallback(ResourceCallback resourceCallback) { 
    this.resourceCallback = resourceCallback; 

} 

private static boolean getTimer() { 

    new CountDownTimer(5000, 1000) { 
     @Override 
     public void onTick(long millisUntilFinished) { 
      // Do Nothing 
      status = false; 
     } 

     @Override 
     public void onFinish() {    
      status = true; 
     } 
    }; 
    return status; 
} 
} 

Исключение:

android.support.test.espresso.IdlingResourceTimeoutException: Wait for [com.adbs.recorder.IntentServiceIdlingResource] to become idle timed out 

ответ

32

Вам нужно IdlingResource с isIdleNow(), который возвращает true только если определенное количество времени, которое прошло. Для достижения этой цели, за исключением времени начала и сравнить его с текущим временем:

public class ElapsedTimeIdlingResource implements IdlingResource { 
    private final long startTime; 
    private final long waitingTime; 
    private ResourceCallback resourceCallback; 

    public ElapsedTimeIdlingResource(long waitingTime) { 
    this.startTime = System.currentTimeMillis(); 
    this.waitingTime = waitingTime; 
    } 

    @Override 
    public String getName() { 
    return ElapsedTimeIdlingResource.class.getName() + ":" + waitingTime; 
    } 

    @Override 
    public boolean isIdleNow() { 
    long elapsed = System.currentTimeMillis() - startTime; 
    boolean idle = (elapsed >= waitingTime); 
    if (idle) { 
     resourceCallback.onTransitionToIdle(); 
    } 
    return idle; 
    } 

    @Override 
    public void registerIdleTransitionCallback(
     ResourceCallback resourceCallback) { 
    this.resourceCallback = resourceCallback; 
    } 
} 

Создать и зарегистрировать этот холостые ресурс в тесте:

@Test 
public static void waitForOneHour() { 
    long waitingTime = DateUtils.HOUR_IN_MILLIS; 

    // Start 
    onView(withId(AaEspressoTest.getId("recorderpage_record"))) 
     .perform(click()); 

    // Make sure Espresso does not time out 
    IdlingPolicies.setMasterPolicyTimeout(
     waitingTime * 2, TimeUnit.MILLISECONDS); 
    IdlingPolicies.setIdlingResourceTimeout(
     waitingTime * 2, TimeUnit.MILLISECONDS); 

    // Now we wait 
    IdlingResource idlingResource = new ElapsedTimeIdlingResource(waitingTime); 
    Espresso.registerIdlingResources(idlingResource); 

    // Stop 
    onView(withId(AaEspressoTest.getId("recorderpage_stop"))) 
     .perform(click()); 

    // Clean up 
    Espresso.unregisterIdlingResources(idlingResource); 
} 

Вам нужны setMasterPolicyTimeout и setIdlingResourceTimeout вызовы, чтобы убедиться, Эспрессо не заканчивает тест из-за тайм-аута.

Полный пример: https://github.com/chiuki/espresso-samples/tree/master/idling-resource-elapsed-time

+1

Этот подход не работает, если у меня есть более одного метода тестирования и вы должны простаивать в конце каждого метода для дикой природы. Я использую Espresso 2.x. –

+0

что такое 'registerIdleTransitionCallback' этот метод и как его использовать? –

12

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

Вы можете изменить это с помощью IdlingPolicies класса для явного задания тайма-аута:

IdlingPolicies.setIdlingResourceTimeout(1, TimeUnit.HOURS); 
+0

также может понадобиться 'IdlingPolicies.setMasterPolicyTimeout (1, TimeUnit.HOURS),' 'для предотвращения AppNotIdleException'. – Travis

Смежные вопросы