5

Ho sofferto un po 'con questo problema, e penso che non sto ottenendo qualcosa di fondamentale su Robolectric. Di solito alcune ricerche su google possono aiutarmi ad andare fino in fondo a questo tipo di problema, ma tra questo e guardando il codice di esempio non trovo nulla di utile.Robolectric, Problemi con le voci dell'elenco di clic

Sto tentando di emulare un clic su un elemento della vista elenco e controllare che un'attività venga avviata dopo il clic. Continuo a tornare sul fatto che l'attività corrente che sto testando è l'attività risultante. Ho provato a rimuovere tutto il codice dell'elemento dell'elenco facendo clic sul codice e controllando l'attività risultante, e questo è tornato come InstallationListActivity che sto testando. Quindi sono giunto alla conclusione che l'elemento della vista elenco non viene cliccato, e non sono sicuro del perché. I log di sistema che ho impostato nel seguente codice di test sono i valori che mi aspetto che siano. L'elenco contiene 13 elementi e getChildAt (0) restituisce l'intestazione. Penserei che ottenere il primo oggetto (getChildAt (1)) e chiamare performClick su di esso o la sua visualizzazione di testo figlio possa avviare l'attività prevista, ma non sembra essere il caso. Ad ogni modo, ecco il codice robolectric/testing Sto usando:

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

Ecco il layout del sto usando per costruire la visualizzazione elenco:

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> 

E qui è il codice che inizializza la lista:

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

Qualsiasi aiuto è molto apprezzato! Grazie mille!

risposta

12

Provate il metodo di supporto performItemClick:

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