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.
W robolectric należy wywołać ShadowListView.populateItems(), aby uzyskać zmiany adaptera ShadowListView shadowListView = Robolectric.shadowOf (listView); shadowListView.populateItems(); – nenick
Dziękuję @nenick! To naprawiło problem, który miałem. Nie mogę oznaczyć Cię jako poprawnej odpowiedzi, ponieważ opublikowałeś komentarz. –
użyłem niewłaściwego pola wejściowego ^^ – nenick