2013-07-22 15 views
7

Tôi chỉ mới bắt đầu với số junit và vấn đề đầu tiên tôi gặp phải là, làm cách nào để thử nghiệm các phân đoạn?Làm thế nào để chạy thử nghiệm trên một đoạn hoạt động

Hoạt động đang được thử nghiệm có 1 đoạn là bố cục chính.

@Override 
protected void setUp() throws Exception { 
    super.setUp(); 
    Intent intent = new Intent(getInstrumentation().getTargetContext(), 
      ActivityWelcome.class); 
    startActivity(intent, null, null); 

    FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); 
    mFragmentWelcome = (FragmentWelcome) fragmentManager.findFragmentByTag(FragmentWelcome.TAG); 
    if (mFragmentWelcome == null) { 

     mFragmentWelcome= FragmentWelcome.newInstance(); 
     fragmentManager 
       .beginTransaction() 
       .replace(android.R.id.content, mFragmentWelcome, FragmentWelcome.TAG) 
       .commit(); 
    } 
} 

sau đó tôi tiếp tục kiểm tra việc bố trí:

@SmallTest 
public void testLayout() { 

    ImageButton buttonImage = (ImageButton) getActivity().findViewById(my.package.R.id.button_invites); 
    assertNotNull(buttonImage); 
    assertEquals("ImageButton Invite has an invalid drawable" 
      , getActivity().getResources().getDrawable(my.package.R.drawable.light_social_invite) 
      , buttonImage); 
} 

Lỗi:

java.lang.NullPointerException 
    at my.package.test.ActivityWelcomeUnitTest.testLayout(ActivityWelcomeUnitTest.java:55) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214) 
    at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:199) 
    at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169) 
    at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154) 
    at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:545) 
    at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1551) 

nó không thành công trên:

ImageButton buttonImage = (ImageButton) mFragmentWelcome.getView().findViewById(my.package.R.id.button_invites); 

Tôi không chắc chắn lý do tại sao mảnh là null, tôi rõ ràng là thực hiện thao tác này incorr ectly, ai đó có thể xin vui lòng khai sáng cho tôi?

+0

Làm thế nào bạn quản lý để chạy thử nghiệm đơn vị. Trong studio android, tôi đang nhận được con trỏ ẩn rỗng tại 'Intent intent = new Intent (getInstrumentation(). GetTargetContext(), ActivityWelcome.class);' TestClass của tôi đang mở rộng 'ActivityUnitTestCase ' –

Trả lời

9

Thực ra bạn phải chờ chuỗi giao diện người dùng soạn chế độ xem chính với các đoạn.

Tôi có cùng lỗi và vì vậy tôi đã xem xét các nguồn của Robotium để xem cách chúng xử lý điều đó. Câu trả lời là họ sử dụng một số phương pháp chờ đợi thời gian cần thiết.

Đối với đoạn bạn có thể sử dụng một cái gì đó như thế trước khi thực hiện khẳng định của bạn:

protected Fragment waitForFragment(String tag, int timeout) { 
     long endTime = SystemClock.uptimeMillis() + timeout; 
     while (SystemClock.uptimeMillis() <= endTime) { 

      Fragment fragment = getActivity().getSupportFragmentManager().findFragmentByTag(tag); 
      if (fragment != null) { 
       return fragment; 
      } 
     } 
     return null; 
    } 

tôi sử dụng một thời gian chờ của 5000ms, có vẻ như để làm việc tốt.

Vì vậy, trong mã của bạn, bạn nên thay thế

mFragmentWelcome = (FragmentWelcome) fragmentManager.findFragmentByTag(FragmentWelcome.TAG); 

bởi

mFragmentWelcome = (FragmentWelcome) waitForFragment(FragmentWelcome.TAG, 5000); 

EDIT: phản ứng này giả junit của bạn kéo dài ActivityInstrumentationTestCase2<T>

+0

Cảm ơn bạn đã trả lời. Làm cho rất nhiều ý nghĩa, tuy nhiên nó đã không giải quyết con trỏ null. – HGPB

+0

Có vẻ như tôi không thể truy cập 'getView() ' – HGPB

+0

junit của bạn có mở rộng' ActivityInstrumentationTestCase2 'không? Không biết nếu nó giúp nhưng trên 'setup()' tôi gọi 'setActivityInitialTouchMode (false)' trước khi tất cả các cuộc gọi trên 'getActivity()'. Ngoài ra tôi đã không thực hiện cuộc gọi trên 'startActivity' ... Cuối cùng, hãy thử tăng giá trị thời gian chờ. – tbruyelle

4

Đối với một bài kiểm tra ActivityUnitTestCase, tôi đã phải thêm (các) dòng sau vào phương pháp waitForFragment:

// haven't really checked if this is necessary 
getInstrumentation().waitForIdleSync(); 
// without this, waitForFragment() failed to find the fragment 
getActivity().getFragmentManager().executePendingTransactions(); 
+0

Cảm ơn bạn đã làm rõ điều này. @tbruyelle câu trả lời đã không làm việc cho tôi. Tôi đã kiểm tra rằng 'waitForIdleSync()' gọi là không thực sự cần thiết. – kazbeel

+0

Làm 'mFragment.getView()' không phải là null? –

+0

sử dụng getSUPPORTFragmentManager(). ExecutePendingT ... đã sử dụng ActivityUnitTestCase, vì tôi đã thêm đoạn bằng cách gọi hàm getSupportFragmentManager(). Hy vọng rằng sẽ giúp một ai đó. – flobacca

1

U có thể sử dụng com.robotium.solo.Solo từ 'com.jayway.android.robotium:robotium-solo:5.2.1'

mInstrumentation = InstrumentationRegistry.getInstrumentation(); 
    mSolo = new Solo(mInstrumentation); 
    mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); 
    ..... 
    mSolo.waitForFragmentById();