2016-05-08 8 views
2

Ich versuche, einen Test für meinen Android-App zu schreiben, die mit einem Cloud-Dienst in Verbindung steht. Theoretisch wird der Fluss für den Test dieser sein soll:Wie JUnit4 machen „Wait“ für asynchronen Job vor dem Ausführen von Tests beenden

  1. sendet Anfrage an den Server in einem Arbeitsthread
  2. Warten Sie auf die Antwort vom Server
  3. die Antwort vom Server zurück prüfen

Ich versuche, Espresso IdlingResource Klasse zu erreichen, aber es funktioniert nicht wie erwartet. Hier ist, was ich bisher

Mein Test:

@RunWith(AndroidJUnit4.class) 
public class CloudManagerTest { 

FirebaseOperationIdlingResource mIdlingResource; 

@Before 
public void setup() { 
    mIdlingResource = new FirebaseOperationIdlingResource(); 
    Espresso.registerIdlingResources(mIdlingResource); 
} 

@Test 
public void testAsyncOperation() { 
    Cloud.CLOUD_MANAGER.getDatabase().getCategories(new OperationResult<List<Category>>() { 
     @Override 
     public void onResult(boolean success, List<Category> result) { 
      mIdlingResource.onOperationEnded(); 
      assertTrue(success); 
      assertNotNull(result); 
     } 
    }); 
    mIdlingResource.onOperationStarted(); 
} 
} 

Die FirebaseOperationIdlingResource

public class FirebaseOperationIdlingResource implements IdlingResource { 

private boolean idleNow = true; 
private ResourceCallback callback; 


@Override 
public String getName() { 
    return String.valueOf(System.currentTimeMillis()); 
} 

public void onOperationStarted() { 
    idleNow = false; 
} 

public void onOperationEnded() { 
    idleNow = true; 
    if (callback != null) { 
     callback.onTransitionToIdle(); 
    } 
} 

@Override 
public boolean isIdleNow() { 
    synchronized (this) { 
     return idleNow; 
    } 
} 

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

Bei Verwendung mit Espresso Ansicht Matcher der Test ordnungsgemäß durchgeführt wird, um die Aktivität wartet und dann das Ergebnis überprüfen.

Die einfachen JUNIT4-Assert-Methoden werden jedoch ignoriert, und JUnit wartet nicht auf den Abschluss meiner Cloud-Operation.

Ist es möglich, dass IdlingResource nur mit Espresso-Methoden arbeiten? Oder mache ich etwas falsch?

+0

Theoretisch denken, sie Anfrage -Etwas wie-wenn Job 'senden erfolgt senden kann true' sonst' false' jede Sekunde und Sie können Ihre Arbeit halten, bis 'true' vom Server kommt durch synchronisierte Methoden. –

Antwort

5

Ich verwende Awaitility für so etwas.

Es ist ein sehr guter Führer hat, hier ist die Grundidee:

Überall dort, wo Sie warten müssen:

await().until(newUserIsAdded()); 

anderswo:

private Callable<Boolean> newUserIsAdded() { 
     return new Callable<Boolean>() { 
      public Boolean call() throws Exception { 
        return userRepository.size() == 1; // The condition that must be fulfilled 
      } 
     }; 
} 

Ich denke, dieses Beispiel ziemlich ähnlich ist was Sie tun, speichern Sie das Ergebnis Ihrer asynchronen Operation in einem Feld und überprüfen Sie es in der call() Methode.

+0

Es hat funktioniert! Wachsamkeit ist die Art von Bibliothek, nach der ich gesucht habe. Ich danke dir sehr ! –

+0

Froh, dass es für Sie funktioniert hat! – nasch