2016-04-11 5 views
10

sto cercando di scrivere un test per verificare l'intenzione di lanciare con caffè espresso, il problema è che intendeva() non registra alcun intento.Espresso non fa registrare alcun intento se non ci sono pulsanti

ho questo test

@Test 
public void shoulddosomething(){ 
    startActivity(); 
    intended(hasComponent(hasClassName(TemplatePictureCaptureActivity.class.getName()))); 

} 

e nella mia attività ho questo codice

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(onRequestLayout()); 
    Intent intent = new Intent(this, TemplatePictureCaptureActivity.class); 
    startActivity(intent); 
} 

Il risultato del test è questo.

android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: Wanted to match 1 intents. Actually matched 0 intents. 

IntentMatcher: has component: has component with: class name: is "cat.helm.recertel.ui.templatepicturecapture.TemplatePictureCaptureActivity" package name: an instance of java.lang.String short class name: an instance of java.lang.String 

Matched intents:[] 

Recorded intents:[] 

ho cercato di lanciare l'intento all'interno onClickListen e ha funzionato, ma senza di esso non posso farlo funzionare. Ho anche provato con le risorse al minimo senza fortuna. Sai come ottenere questo?

+1

Provare ad attendere un po 'prima del previsto (hasComponent (hasClassName (TemplatePictureCaptureActivity.class.getName()))); – ozo

+0

Ha funzionato grazie. Ma non è un cattivo odore di codice? – Borja

+0

Io non la penso così. Immagino che la vista non sia ancora pronta mentre testiamo l'intento, Android sta ancora impostando la vista (setContentView (onRequestLayout())), ecco perché non riesce a trovare l'intento. Nel caso del clic del pulsante, si fa clic dopo aver impostato la vista. – ozo

risposta

8

La soluzione è quello di registrare una risorsa minimo di aspettare la seconda attività.

Nel mio caso il test rimarrà come segue:

@Test 
public void shoulddosomething() { 
    startActivity(); 
    String templatePictureActivityClassName = TemplatePictureCaptureActivity.class.getName(); 
    Espresso.registerIdlingResources(new WaitActivityIsResumedIdlingResource(templatePictureActivityClassName)); 
    intended(hasComponent(hasClassName(templatePictureActivityClassName))); 
} 

E qui la risorsa minimo.

private static class WaitActivityIsResumedIdlingResource implements IdlingResource { 
    private final ActivityLifecycleMonitor instance; 
    private final String activityToWaitClassName; 
    private volatile ResourceCallback resourceCallback; 
    boolean resumed = false; 
    public WaitActivityIsResumedIdlingResource(String activityToWaitClassName) { 
     instance = ActivityLifecycleMonitorRegistry.getInstance(); 
     this.activityToWaitClassName = activityToWaitClassName; 
    } 

    @Override 
    public String getName() { 
     return this.getClass().getName(); 
    } 

    @Override 
    public boolean isIdleNow() { 
     resumed = isActivityLaunched(); 
     if(resumed && resourceCallback != null) { 
      resourceCallback.onTransitionToIdle(); 
     } 

     return resumed; 
    } 

    private boolean isActivityLaunched() { 
     Collection<Activity> activitiesInStage = instance.getActivitiesInStage(Stage.RESUMED); 
     for (Activity activity : activitiesInStage) { 
      if(activity.getClass().getName().equals(activityToWaitClassName)){ 
       return true; 
      } 
     } 
     return false; 
    } 

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

È possibile annullare la registrazione della risorsa inattiva dopo il test. – iamreptar

+0

Ciò non funzionerà necessariamente se si dispone di una sola attività che si sta avviando ancora e ancora con dati diversi, però. – scriptocalypse

2

Prova ad aspettare un po 'prima

intended(hasComponent(hasClassName(TemplatePictureCaptureActivity.class.getName(‌​)))); 
+2

Ho svolto ulteriori accertamenti e la sua soluzione non sempre funziona, a seconda del periodo di tempo in cui il test ha esito negativo o meno e tale importo potrebbe cambiare. Ho trovato una soluzione adeguata. – Borja

Problemi correlati