Intereting Posts
Слайд для удаления с вращением Android ADB Shell не включает пакеты Возможно ли читать исходный текстовый файл без ссылки на контекст в проекте библиотеки Android Hello-jni NDK sample – ndk-build не работает Как создать хэш-код Facebook? Как добавить интерактивный значок в самый левый угол панели действий на Android? Почему RxJava с доработкой на Android doOnError () не работает, но Subscriber onError делает Эмулятор Android не запускается, показывая «недопустимый параметр командной строки», EditText не показывает текущий вход (Android 4) Android – общий доступ к содержимому Facebook Значок приложения запуска не удаляется с Начального экрана при удалении приложения для Android Разница между тестом Android Instrumentation и модульным тестированием в Android Studio? Каков наилучший способ включить номер сборки для отслеживания Native App Google Analytics? Настройка андроидного поиска, Google Analytics V2 не записывает статистику из приложения Android

Robolectric test ListView не обновляется после изменения стоимости адаптера

Я создал макет с ListView который обновляет в нем значения в зависимости от того, какая из 2 нажатых кнопок нажата. Нажатие кнопки с надписью «Коэффициенты» очищает все значения и добавляет нечетные числа до 20. Нажатие кнопки evens делает то же самое, за исключением четных чисел. Это отлично работает при эмулировании или проверке на реальном устройстве. Ниже приведен код активности.

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

Однако при попытке протестировать его с помощью Robolectric ListView никогда не обновляется, даже если адаптер имеет модификацию значений. Вот мой тестовый код.

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

Не могли бы вы сообщить мне, что мне нужно сделать, чтобы инициировать обновление в ListView через Robolectric.

В robolectric вы должны вызвать ShadowListView.populateItems() чтобы получить изменения адаптера

Robolectric 3.0

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

Robolectric 2.0

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

Просто обновить ответ Robolectric 3.0

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