2014-07-08 12 views
5

Ich bin Neuling auf Android und bleibe beim Testen eines SplashScreen stecken, im Grunde, was ich tue, versucht zu testen, dass der Splash-Screen für 3s bleibt. Dies ist der Code für den BegrüßungsbildschirmAndroid Testing Handler.postDelayed

@Override 
protected void onStart() { 
    super.onStart(); 

    new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      Intent i = new Intent(SplashScreenActivity.this, MainActivity.class); 
      startActivity(i); 
      finish(); 
     } 
    }, SPLASH_TIME_OUT); 
} 

Und das ist mein Ansatz für den Test:

@Test 
public void splashScreenTimerTest() throws InterruptedException { 
    StopWatch timer = new StopWatch(); 
    timer.start(); 

    splashScreenActivityController.start(); 

    timer.stop(); 
    long expected = 3000L; 
    assertThat(String.format("The spalash screen run for longer than expected. It should stay on for [%d] but it run for [%d]",expected,timer.getTime()),timer.getTime(),equalTo(expected)); 
} 

Ich bin mit Android + Robolectric zum Testen.

Ich habe seit ein paar Tagen gegoogelt, ich habe viele Dinge ausprobiert, aber kein Ergebnis. Ich versuche den UI-Thread zu bekommen und warte darauf. Ich habe versucht, Sie zu scheduler, um die Warteschlange zu bekommen und sehen, ob es dort eine Aufgabe gibt. Aber kein Ergebnis.

Jeder Vorschlag wie kann ich meinen Test warten lassen, bis die neue Aktivität ausgelöst wird?

Dank

Antwort

7

Sie können versuchen:

Robolectric.pauseMainLooper(); 
Robolectric.getUiThreadScheduler().advanceBy(intervalMs); 
Robolectric.unPauseMainLooper(); 

oder, wenn Sie nur die runnable war aufgerufen werden:

Robolectric.runUiThreadTasksIncludingDelayedTasks(); 
+0

Danke für den er lp, ich überprüfe es später! – Rabel

+0

Großartige Arbeiten wie Charme –

13

In Robolectric 3.0 sie diese API aktualisiert. Die aktuelle Version:

ShadowLooper.runUiThreadTasksIncludingDelayedTasks();

Anwendungsbeispiel:

public class MainActivity extends AppCompatActivity { 
    ........ 

    public void finishGame() { 
     Handler h = new Handler(); 
     h.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       finish(); 
      } 
     }, 5000); 
    } 
} 

Test-arount es:

@RunWith(RobolectricTestRunner.class) 
@Config(constants = BuildConfig.class, sdk=21) 
public class MainActivityTest { 

    @Test 
    public void testFinishing() throws InterruptedException { 
     MainActivity mainActivity = new MainActivity(); 

     assertFalse(mainActivity.isFinishing()); 

     mainActivity.finishGame(); 
     ShadowLooper.runUiThreadTasksIncludingDelayedTasks(); 

     assertTrue(mainActivity.isFinishing()); 
    } 
} 
+0

Oh! Vielen Dank :) – cVoronin

2

In Robolectric 3.0 IuriiO Antwort würde übersetzen to-

ShadowLooper.pauseMainLooper(); 
Robolectric.getForegroundThreadScheduler().advanceBy(intervalMs); 
ShadowLooper.unPauseMainLooper(); 
Verwandte Themen