2012-08-02 15 views
6

Tôi đang thử nghiệm hai lớp Activity khác nhau, trong đó một lớp Activity xảy ra để gọi cho người kia. Dưới đây là mã của tôi và sau đó tôi sẽ giải thích vấn đề:phương thức getActivity() chặn vô thời hạn trong khi kiểm thử đơn vị

IntroActivityTest

public class IntroActivityTest extends ActivityInstrumentationTestCase2<IntroActivity> { 

    IntroActivity activity; 

    public IntroActivityTest() { 

     super(IntroActivity.class); 
    } 

    @Override 
    protected void setUp() throws Exception { 

     super.setUp(); 
     activity = getActivity(); 
    } 

    public void testIntroBypass() { 

     if (new SharedPreferencesHelper(getInstrumentation().getTargetContext()).retrieveUserToken() == null) { 
      assertTrue(!activity.isFinishing()); 
     } 
     else { 
      assertTrue(activity.isFinishing()); 
     } 
    } 
} 

RootActivityTest:

public class RootActivityTest extends ActivityInstrumentationTestCase2<RootActivity> { 

    RootActivity activity; 

    public RootActivityTest() { 

     super(RootActivity.class); 
    } 

    @Override 
    protected void setUp() throws Exception { 

     super.setUp(); 
     activity = getActivity(); 
    } 

    public void testInitialTab() { 

     assertTrue(activity.getSupportActionBar().getSelectedTab().getText().toString().equalsIgnoreCase("Library")); 
    } 
} 

Trong IntroActivityTest, nếu token của user từ SharedPreferences là phi null, nó ngay lập tức bắt đầu RootActivity. Nếu nó là null, nó nằm trên IntroActivity. Vấn đề là nếu nó không phải là null, kiểm tra đầu tiên (IntroActivityTest) qua, và sau đó nó treo trên các cuộc gọi phương thức getActivity() trong RootActivityTest và kiểm tra chỉ đóng băng ... không có trường hợp ngoại lệ, nó chỉ treo trên dòng đó. Nếu mã thông báo người dùng là null, nó sẽ chạy cả hai kiểm tra hoàn toàn tốt.

Điều gì có thể gây ra điều này? Từ quan sát, có vẻ như RootActivityTest đang cố gắng sử dụng RootActivity đã được bắt đầu từ IntroActivity, nhưng không nên bắt đầu phiên bản riêng của mình là RootActivity?

Trả lời

7

Theo ActivityInstrumentationTestCase2 API:

Lớp này cung cấp thử nghiệm chức năng của một hoạt động đơn lẻ. Hoạt động được thử nghiệm sẽ được tạo ra bằng cách sử dụng cơ sở hạ tầng hệ thống (bằng cách gọi InstrumentationTestCase.launchActivity()) và sau đó bạn sẽ có thể thao tác trực tiếp Hoạt động của mình.

Mỗi hoạt độngInstrumentationTestCase2 thực hiện hoàn toàn cô lập và có vòng đời riêng không phụ thuộc vào hoạt động ActivityInstrumentationTestCase2 khác. Một hoạt động có thể kiểm tra phải luôn được tạo ra thông qua cơ sở hạ tầng thiết bị đo đạc, không phải từ ứng dụng được thử nghiệm. Trong trường hợp của bạn, RootActivityTest sẽ không nhận RootActivity bắt đầu bằng IntroActivity từ ứng dụng và kiểm tra chạy liên tục đối với RootActivity. Nếu có một RootActivity đến từ không có nơi nào (không phải bởi InstrumentationTestRunner) và được đưa vào trước, khi chạy RootActivityTest, InstrumentationTestRunner sẽ bị lẫn lộn khi cố gắng tạo RootActivity có thể kiểm tra, và đơn giản dừng lại và đợi người lạ này bị giết.

Để kiểm tra những gì bạn muốn, nghĩa là nếu mã thông báo người dùng từ SharedPreferences không phải là null, nó ngay lập tức khởi động RootActivity. Nếu nó là null, nó nằm trên IntroActivity, bạn có thể viết mọi thứ trong IntroActivityTest và sử dụng Instrumentation.ActivityMonitor phát hiện RootActivity bắt đầu từ IntroActivity. Hãy xem here để biết mẫu mã. lưu ý rằng bạn cần hoàn thành RootActivity sau khi thực hiện kiểm tra trong IntroActivityTest để RootActivity có thể khởi động đúng khi gọi hàm getActivity() trong RootActivityTest.

Sử dụng RootActivityTest để kiểm tra mọi thứ liên quan đến RootActivity sau khi nó đã được bắt đầu và đưa lên phía trước, ví dụ, TextView được hiển thị tốt, nhấn nút làm điều đúng và vv Trong RootActivityTest, bạn không cần phải quan tâm đến đâu và cách RootActivity được bắt đầu, chỉ cần gọi phương thức getActivity() và yêu cầu thiết bị cho một RootActivity có thể kiểm tra.

+0

Câu trả lời hay! Trong trường hợp của tôi, tôi cần thiết lập màn hình của mình _before_ tôi gọi là 'getActivity() 'vì' Activity' mới của tôi đã bắt đầu trong 'onCreate()'. –

0

Tôi phải đối mặt với cùng một vấn đề khi thử nghiệm trước đó chưa đóng hoạt động và thử nghiệm mới bắt đầu tương tự với mục đích.Nhưng OS Android thấy hoạt động đó đã bắt đầu và không có gì, do đó, InstrumentationTestCase bắt đầu đợi hoạt động đã bị tấn công