2015-02-13 9 views
8

Utworzono układ z ListView, który aktualizuje wartości w zależności od tego, który z 2 przycisków jest wciśnięty. Naciśnięcie przycisku oznaczonego Odds powoduje wyczyszczenie wszystkich wartości i dodaje liczby nieparzyste do 20. Naciśnięcie evens robi to samo z wyjątkiem liczb parzystych. Działa to dobrze, gdy jest emulowane lub wypróbowywane na prawdziwym urządzeniu. Poniżej znajduje się kod aktywności.Lista testów Robolectric nie aktualizuje się po zmianie wartości w adapterze

public class ListViewActivity extends Activity { 

    private ListView mainListView; 
    private ArrayAdapter<String> listAdapter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.robolectric_test_main); 

     mainListView = (ListView) findViewById(R.id.mainListView); 

     ArrayList<String> numbersList = new ArrayList<String>(); 
     for (int i = 1; i < 21; i++) { 
      numbersList.add(String.valueOf(i)); 
     } 

     listAdapter = new ArrayAdapter<String>(this, R.layout.robolectric_listview_row, numbersList); 

     mainListView.setAdapter(listAdapter); 
    } 

    public void onOddsClicked(View view) { 
     listAdapter.clear(); 
     for (int i = 1; i < 21; i += 2) { 
      listAdapter.add(String.valueOf(i)); 
     } 
    } 

    public void onEvensClicked(View view) { 
     listAdapter.clear(); 
     for (int i = 2; i < 21; i += 2) { 
      listAdapter.add(String.valueOf(i)); 
     } 
    } 
} 

Jednak gdy próbuje przetestować go z Robolectric ListView nie jest aktualizowana, mimo że adapter ma modyfikacji wartości. Oto mój kod testowy.

@RunWith(RobolectricTestRunner.class) 
public class ListViewActivityTest { 

    private ListViewActivity listViewActivity; 
    private Button oddsButton; 
    private Button evensButton; 
    private ListView numbersList; 

    @Before 
    public void setUp() throws Exception { 
     listViewActivity = Robolectric.buildActivity(ListViewActivity.class).create().start().resume().visible().get(); 
     assignFields(); 
    } 

    private void assignFields() { 
     oddsButton = (Button) listViewActivity.findViewById(R.id.oddsButton); 
     evensButton = (Button) listViewActivity.findViewById(R.id.evensButton); 
     numbersList = (ListView) listViewActivity.findViewById(R.id.mainListView); 
    } 

    @Test 
    public void odds() throws Exception { 
     // check all numbers are odd 
     Robolectric.clickOn(oddsButton); 
     Robolectric.runUiThreadTasksIncludingDelayedTasks(); 
     for (int i = 0; i < numbersList.getChildCount(); i++) { 
      TextView number = (TextView) numbersList.getChildAt(i); 
      String numberString = number.getText().toString(); 
      int parsedInt = Integer.parseInt(numberString); 
      assertTrue((parsedInt % 2) == 1); 
     } 
    } 

    @Test 
    public void evens() throws Exception { 
     // check all numbers are even 
     Robolectric.clickOn(evensButton); 
     Robolectric.runUiThreadTasksIncludingDelayedTasks(); 
     for (int i = 0; i < numbersList.getChildCount(); i++) { 
      TextView number = (TextView) numbersList.getChildAt(i); 
      String numberString = number.getText().toString(); 
      int parsedInt = Integer.parseInt(numberString); 
      assertTrue((parsedInt % 2) == 0); 
     } 
    } 

} 

Czy możesz dać mi znać, co muszę zrobić, aby wywołać aktualizację na ListView przez Robolectric.

+0

W robolectric należy wywołać ShadowListView.populateItems(), aby uzyskać zmiany adaptera ShadowListView shadowListView = Robolectric.shadowOf (listView); shadowListView.populateItems(); – nenick

+0

Dziękuję @nenick! To naprawiło problem, który miałem. Nie mogę oznaczyć Cię jako poprawnej odpowiedzi, ponieważ opublikowałeś komentarz. –

+0

użyłem niewłaściwego pola wejściowego ^^ – nenick

Odpowiedz

10

W robolectric należy zadzwonić ShadowListView.populateItems() dostać adapter zmienia

Robolectric 3,0

ShadowListView shadowListView = Shadows.shadowOf(mListView); 
shadowListView.populateItems(); 

Robolectric 2,0

ShadowListView shadowListView = Robolectric.shadowOf(listView); 
shadowListView.populateItems(); 
4

Wystarczy zaktualizować odpowiedź Robolectric 3,0

ShadowListView shadowListView = Shadows.shadowOf(mListView); 
    shadowListView.populateItems(); 
Powiązane problemy