2014-07-08 19 views
5

Android'de yeni bir kullanıcıyım ve bir SplashScreen'i test etmekte takıldım, temelde yaptığım şey, ekranın 3 saniye boyunca açık olduğunu test etmeye çalışıyor. Bu splashscreenAndroid Test 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); 
} 

kodudur Ve bu test için benim yaklaşımdır:

@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)); 
} 

Ben test için Android + Robolectric kullanıyorum.

Birkaç günlüğüne uğraştım, birçok şeyi denedim ama sonuç yok. UI Thread'i almaya çalışıyorum ve bekleyin. Kuyruk almak ve orada herhangi bir görev olup olmadığını görmek için programlayıcıyı denedim. Ama sonuç yok.

Herhangi bir öneri, testimi yeni Etkinlik tetiklenene kadar nasıl bekletebilirim? Sadece çağrılacak çalıştırılabilir olsaydı

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

ya,:

Teşekkür

cevap

7

Deneyebilirsin

Robolectric.runUiThreadTasksIncludingDelayedTasks(); 
+0

to O için teşekkürler lp, daha sonra kontrol edeceğim! – Rabel

+0

Büyük çekicilik –

13

Robolectric 3.0, onlar bu API güncellendi. Gerçek versiyon:

ShadowLooper.runUiThreadTasksIncludingDelayedTasks();

Kullanım örneği:

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

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

Testi bunu arount:

@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 gibi çalışıyor! Teşekkür ederim :) – cVoronin

2

Robolectric 3.0'da, IuriiO cevabı tercüme ediyorum

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