2016-04-11 12 views
10

Próbuję napisać test, aby zweryfikować zamiar uruchomienia z espresso, problem polega na tym, że przeznaczony() nie rejestruje żadnego zamiaru.Espresso nie zapisuje żadnych zamiarów, jeśli nie ma przycisków

mam ten test

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

} 

iw mojej aktywności Mam ten kod

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

Wynik testu jest następująca.

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:[] 

Próbowałem uruchomić intencji wewnątrz onClickListen i to działało, ale bez niego nie mogę zmusić go do pracy. Próbowałem też bezczynnie korzystać z zasobów bez powodzenia. Czy wiesz, jak to osiągnąć?

+1

Spróbuj trochę poczekać przed zamierzonym (hasComponent (hasClassName (TemplatePictureCaptureActivity.class.getName()))); – ozo

+0

To zadziałało dzięki. Ale czy to nie jest zły zapach kodu? – Borja

+0

Nie sądzę. Domyślam się, że widok nie jest jeszcze gotowy podczas testowania intencji, Android wciąż ustawia widok (setContentView (onRequestLayout())), dlatego nie może znaleźć intencji. W przypadku kliknięcia przycisku kliknięcie następuje po ustawieniu widoku. – ozo

Odpowiedz

8

rozwiązaniem jest zarejestrowanie zasób jałowego czekać drugą aktywność.

W moim przypadku test pozostanie w następujący sposób:

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

a tu zasobów na biegu jałowym.

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

Możesz rozważyć wyrejestrowanie zasobu bezczynności po zakończeniu testu. – iamreptar

+0

To niekoniecznie będzie działać, jeśli masz tylko jedną Aktywność, którą uruchamiasz ponownie z różnymi danymi. – scriptocalypse

2

Spróbuj poczekać trochę przed

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

Zrobiłem dalsze dochodzenie i twoje rozwiązanie nie zawsze działa, w zależności od podanego czasu, kiedy test się nie powiedzie i ta kwota może ulec zmianie. Znalazłem właściwe rozwiązanie. – Borja

Powiązane problemy