Я немного боролся с этой проблемой, и я думаю, что не понимаю ничего фундаментального о Robolectric. Обычно некоторые поиски в Google могут помочь мне разобраться в проблеме такого типа, но между этим и просмотром примера кода я не нахожу ничего полезного.
Я пытаюсь эмулировать щелчок по элементу представления списка и проверить, что действие запускается после щелчка. Я продолжаю получать ответ, что текущая активность, которую я тестирую, является результирующей активностью. Я попытался удалить весь код щелчка элемента списка и проверить результирующую активность, и это вернулось как InstallationListActivity, которую я тестирую. Итак, я пришел к выводу, что элемент представления списка не нажимается, и я просто не уверен, почему. Системные журналы, которые я настроил в коде тестирования ниже, представляют собой значения, которые я ожидаю от них. Список состоит из 13 элементов, и getChildAt (0 )возвращает заголовок. Я бы подумал, что получение первого элемента (getChildAt (1 ))и вызов executeClick для него или его дочернего текстового представления запустит ожидаемую активность, но, похоже, это не так. Так или иначе,вот код robolectric/тестирования, который я использую:
@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()));
}
}
Вот макет, который я использую для построения представления списка:
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>
А вот код, который инициализирует список:
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);
}
});
Любая помощь высоко ценится! Благодаря тонну!