5

Bu sorunla biraz uğraşıyordum ve sanırım Robolectric hakkında temel bir şey elde etmiyorum. Genellikle bazı Google aramaları, bu tür bir sorunun alt kısmına ulaşmamda yardımcı olabilir, ancak bu kodla örnek kodlara bakarak kullanımda hiçbir şey bulamıyorum.Robolectric, Liste öğelerini tıklatma ile ilgili sorunlar

Liste görünümü öğesine bir tıklama taklit etmeye çalışıyorum ve bir etkinliğin tıklamadan sonra başlatıldığını kontrol ediyorum. Test ettiğim mevcut etkinliğin sonuçta meydana gelen etkinlik olduğunu tekrar hatırlıyorum. Tüm liste öğesini tıklatıp kodu tıklatıp sonuçta oluşan etkinliği denetlemeyi denedim ve bu, test ettiğim InstallationListActivity olarak geri döndü. Bu yüzden liste görünümü öğesinin tıklanmadığı sonucuna vardım ve neden emin değilim. Aşağıdaki test kodunda kurduğum sistem kayıtları, olmasını beklediğim değerler. Liste 13 öğedir ve getChildAt (0) üstbilgiyi döndürür. İlk maddeyi (getChildAt (1)) almayı ve onun üzerinde performClick'i çağırmayı veya onun çocuk metin görünümünde beklenen etkinliğimi başlatmayı düşünürdüm ama bu durum böyle görünmüyor. İşte

@Before 
    public void setUp() { 
     mAppLaunch = new ApplicationLaunchActivity(); 
     mAppLaunch.onCreate(null); 
     mActivity = new InstallationListActivity(); 
     mActivity.onCreate(null); 
    } 

    @Test 
    public void shouldHaveNonEmptyInstallationList() throws Exception { 
     assert(mActivity.installationListCount() > 0); 
    } 

    @Test 
    public void shouldHaveSameNumberOfElements() throws Exception { 
     ListView installationListView = (ListView) mActivity.getListView(); 

     ShadowListView shadowListView = shadowOf(installationListView); 

     assert(shadowListView.getChildCount() == mActivity.installationListCount()); 
    } 

    @Test 
    public void pressingTheFirstItemInTheListShouldLaunchVenueListActivity() { 
     ListView installationListView = (ListView) mActivity.findViewById(android.R.id.list); 

     System.out.println("qty: " + installationListView.getChildCount()); 
     System.out.println("class: " + installationListView.getChildAt(0).getClass()); 
     System.out.println("class: " + installationListView.getChildAt(1).getClass()); 
     System.out.println("class: " + installationListView.getChildAt(2).getClass()); 
     System.out.println("class: " + installationListView.getChildAt(3).getClass()); 
     System.out.println("class: " + installationListView.getChildAt(4).getClass()); 

     LinearLayout firstItemLayout = (LinearLayout) installationListView.getChildAt(1); 
     TextView firstItem = (TextView) firstItemLayout.getChildAt(0); 

     ShadowTextView shadowFirstItem = shadowOf(firstItem); 
     ShadowLinearLayout shadowLayout = (ShadowLinearLayout) shadowOf(firstItemLayout); 

     shadowLayout.performClick(); 
     shadowFirstItem.performClick(); 

     clickOn(firstItem); 
     clickOn(firstItemLayout); 

     System.out.println("class: " + firstItemLayout.getChildAt(0).getClass()); 
     System.out.println("Layout shadow" + shadowOf(firstItemLayout).getClass()); 
     System.out.println("First Item Text: " + shadowFirstItem.getText()); 

     ShadowActivity shadowActivity = shadowOf(mActivity); 
     Intent startedIntent = shadowActivity.getNextStartedActivity(); 
     assertNotNull(startedIntent); 
     ShadowIntent shadowIntent = shadowOf(startedIntent); 

     assertThat(shadowIntent.getComponent().getClassName(), equalTo(VenueListActivity.class.getName())); 
    } 
} 

düzen ı liste görünümünü inşa etmek kullanıyorum geçerli:: Burada

This is list.xml 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent"> 
    <ListView android:id="@android:id/list" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:cacheColorHint="#00000000" 
       android:background="@drawable/background"/> 
</LinearLayout> 

list_item.xml 


<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:id="@+id/list_item" 
       android:layout_height="fill_parent" 
       android:layout_width="fill_parent"> 
    <TextView android:id="@+id/list_item_text" 
       style="@style/tw_list_font" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:textAppearance="?android:attr/textAppearanceLarge" 
       android:gravity="center_vertical" 
       android:paddingLeft="6dip" 
       android:minHeight="?android:attr/listPreferredItemHeight" /> 
</LinearLayout> 

Ve liste başlatır kod edilir Neyse, işte ben kullanıyorum robolectric/test kodudur:

InstallationListActivity.java 

setContentView(R.layout.list); 
     final ListView installationListView = getListView(); 
     LayoutInflater inflater = getLayoutInflater(); 
     ViewGroup header = (ViewGroup) inflater.inflate(R.layout.header, installationListView, false); 
     TextView headerText = (TextView) header.findViewById(R.id.header_text); 
     headerText.setText("Installations On Live"); // TODO: This should not be hardcoded 
     installationListView.addHeaderView(header, null, false); 

     setListAdapter(new ArrayAdapter<Installation>(this, R.layout.list_item, R.id.list_item_text, mInstallations)); 

     // Click event 
     installationListView.setClickable(true); 
     installationListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int position, long arg1) { 
       Installation installationClicked = (Installation) installationListView.getItemAtPosition(position); 
       if (LOCAL_LOG) { 
        Log.d(LOG_TAG, "Installation: " + installationClicked.toString() + " clicked."); 
        Log.d(LOG_TAG, installationClicked.toString() + " has installationDirectory: " + 
          installationClicked.rootDir); 
       } 
       AppState.installation = installationClicked; 
       AppState.serverInstallationName = installationClicked.rootDir; 
       Intent venueListIntent = new Intent(InstallationListActivity.this, VenueListActivity.class); 
       startActivity(venueListIntent); 
      } 
     }); 

Herhangi bir yardım çok takdir edilmektedir! Teşekkürler bir ton!

cevap

12

deneyin yardımcı yöntem performItemClick:

Robolectric.shadowOf(listView).performItemClick(position);