2014-07-08 12 views
5

Tôi là người mới sử dụng Android và gặp khó khăn khi thử nghiệm SplashScreen, về cơ bản những gì tôi đang làm là cố gắng kiểm tra màn hình giật gân trong 3 giây. đây là mã cho SplashscreenAndroid 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); 
} 

Và đây là cách tiếp cận của tôi cho kỳ thi này:

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

Tôi đang sử dụng Android + Robolectric để thử nghiệm.

Tôi đã googling trong một vài ngày, tôi đã thử nhiều thứ nhưng không có kết quả nào cả. Tôi cố gắng lấy Thread UI và đợi nó. Tôi đã cố gắng để bạn lên lịch để có được hàng đợi và xem nếu có bất kỳ nhiệm vụ ở đó. Nhưng không có kết quả nào cả.

Bất kỳ đề xuất nào làm cách nào để thử nghiệm của tôi đợi cho đến khi Hoạt động mới được kích hoạt?

Cảm ơn

Trả lời

7

Bạn có thể thử:

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

hoặc, nếu bạn chỉ là Runnable được gọi là:

Robolectric.runUiThreadTasksIncludingDelayedTasks(); 
+0

Cảm ơn vì anh ấy lp, tôi sẽ kiểm tra sau! – Rabel

+0

Các tác phẩm tuyệt vời như quyến rũ –

13

Trong Robolectric 3,0, họ cập nhật API này. Các phiên bản thực tế:

ShadowLooper.runUiThreadTasksIncludingDelayedTasks();

Cách sử dụng Ví dụ:

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

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

thử nghiệm arount nó:

@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! Cảm ơn bạn :) – cVoronin

2

Trong Robolectric 3.0, câu trả lời IuriiO của sẽ dịch to-

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