Intereting Posts
Как использовать ClickableSpan, но игнорировать клики из TextView Android. Почему использование интерфейса считается лучшей практикой общения между Activity и Fragment? Ошибка: compileSdkVersion android-21 требует компиляции с JDK 7 Одна кнопка – 3 магазина приложений – как перенаправить пользователя в соответствующее приложение? Приложение не отображается в списке последних приложений при открытии через PendingIntent Как обращаться с Facebook ShareDialog.canShow () == false на Android Нет проблем с проверкой подлинности. Необходимые обсуждения можно найти в Интернете по адресу: OkHttp – включить журналы Создание / создание штрих-кода в Android Ограничения SQLITE на Android – 25 таблиц с 15 столбцами каждая и 10 тыс. Строк на таблицу Ошибка импорта android.support.v7.widget.CardView в Eclipse Aapt.exe прекратил работу в eclipse 4.3 kepler SDK 22.3 API уровня 19 Android | CardView остается выше TextView Ошибка «Отсутствие экземпляра типа» при вызове метода из другого класса в 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();