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
- sendet Anfrage an den Server in einem Arbeitsthread
- Warten Sie auf die Antwort vom Server
- 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?
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. –