Как проверить ListView с Robolectric 2.2? Он говорит, что android.widget.ListView еще не реализован

Когда я запускаю JUnit-тест с Robolectric 2.2 на моем ListActivity, я получаю InflateException, в котором говорится, что ListView не реализован. Как мне обойти это? Я как-то расследовал использование .shadowOf (), но я не уверен, как это сделать.

Вот трассировка стека:

         Android.view.InflateException: файл XML ./res/layout/activity_main.xml строка # -1 (извините, еще не реализовано): ошибка раздувания класса android.widget.ListView
         На android.view.LayoutInflater.createView (LayoutInflater.java:613)
         На org.robolectric.shadows.RoboLayoutInflater.onCreateView (RoboLayoutInflater.java:38)
         На android.view.LayoutInflater.onCreateView (LayoutInflater.java:660)
         На android.view.LayoutInflater.createViewFromTag (LayoutInflater.java:685)
         На android.view.LayoutInflater.rInflate (LayoutInflater.java:746)
         На android.view.LayoutInflater.inflate (LayoutInflater.java:489)
         На android.view.LayoutInflater.inflate (LayoutInflater.java:396)
         На android.view.LayoutInflater.inflate (LayoutInflater.java:352)
         В com.android.internal.policy.impl.PhoneWindow.setContentView (PhoneWindow.java:256)
         At android.app.Activity.setContentView (Activity.java:1867)
         At com.jch.latransit.MainActivity.onCreate (MainActivity.java:43)
         At android.app.Activity.performCreate (Activity.java:5008)
         At org.fest.reflect.method.Invoker.invoke (Invoker.java:112)
         At org.robolectric.util.ActivityController $ 1.run (ActivityController.java:116)
         At org.robolectric.shadows.ShadowLooper.runPaused (ShadowLooper.java:256)
         At org.robolectric.util.ActivityController.create (ActivityController.java:111)
         At org.robolectric.util.ActivityController.create (ActivityController.java:123)
         At com.jch.latransit.domain.TestTimeStamp.setUp (TestTimeStamp.java:33)
         На org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall (FrameworkMethod.java:45)
         На org.junit.internal.runners.model.ReflectiveCallable.run (ReflectiveCallable.java:15)
         На org.junit.runners.model.FrameworkMethod.invokeExplosively (FrameworkMethod.java:42)
         На org.junit.internal.runners.statements.RunBefores.evaluate (RunBefores.java:27)
         At org.junit.internal.runners.statements.RunAfters.evaluate (RunAfters.java:30)
         На org.robolectric.RobolectricTestRunner $ 2. оценить (RobolectricTestRunner.java:234)
         На org.junit.runners.ParentRunner.runLeaf (ParentRunner.java:263)
         На org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:68)
         На org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:47)
         На org.junit.runners.ParentRunner $ 3.run (ParentRunner.java:231)
         На org.junit.runners.ParentRunner $ 1.schedule (ParentRunner.java:60)
         На org.junit.runners.ParentRunner.runChildren (ParentRunner.java:229)
         На org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:50)
         На org.junit.runners.ParentRunner $ 2.оценить (ParentRunner.java:222)
         На org.junit.internal.runners.statements.RunBefores.evaluate (RunBefores.java:28)
         На org.robolectric.RobolectricTestRunner $ 1. оценить (RobolectricTestRunner.java:175)
         На org.junit.runners.ParentRunner.run (ParentRunner.java:300)
         На org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run (JUnit4TestReference.java:50)
         At org.eclipse.jdt.internal.junit.runner.TestExecution.run (TestExecution.java:38)
         На org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:467)
         На org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:683)
         На org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run (RemoteTestRunner.java:390)
         На org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (RemoteTestRunner.java:197)
     Вызывается: java.lang.reflect.InvocationTargetException
         At sun.reflect.NativeConstructorAccessorImpl.newInstance0 (собственный метод)
         At sun.reflect.NativeConstructorAccessorImpl.newInstance (NativeConstructorAccessorImpl.java:57)
         На sun.reflect.DelegatingConstructorAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java:45)
         В java.lang.reflect.Constructor.newInstance (Constructor.java:526)
         At android.view.LayoutInflater. $$ robo $$ LayoutInflater_1d1f_createView (LayoutInflater.java:587)
         На android.view.LayoutInflater.createView (LayoutInflater.java)
         На org.robolectric.shadows.RoboLayoutInflater.onCreateView (RoboLayoutInflater.java:38)
         At android.view.LayoutInflater. $$ robo $$ LayoutInflater_1d1f_onCreateView (LayoutInflater.java:660)
         На android.view.LayoutInflater.onCreateView (LayoutInflater.java)
         At android.view.LayoutInflater. $$ robo $$ LayoutInflater_1d1f_createViewFromTag (LayoutInflater.java:685)
         На android.view.LayoutInflater.createViewFromTag (LayoutInflater.java)
         At android.view.LayoutInflater. $$ robo $$ LayoutInflater_1d1f_rInflate (LayoutInflater.java:746)
         На android.view.LayoutInflater.rInflate (LayoutInflater.java)
         At android.view.LayoutInflater. $$ robo $$ LayoutInflater_1d1f_inflate (LayoutInflater.java:489)
         На android.view.LayoutInflater.inflate (LayoutInflater.java)
         At android.view.LayoutInflater. $$ robo $$ LayoutInflater_1d1f_inflate (LayoutInflater.java:396)
         На android.view.LayoutInflater.inflate (LayoutInflater.java)
         At android.view.LayoutInflater. $$ robo $$ LayoutInflater_1d1f_inflate (LayoutInflater.java:352)
         На android.view.LayoutInflater.inflate (LayoutInflater.java)
         На com.android.internal.policy.impl.PhoneWindow. $$ robo $$ PhoneWindow_1a87_setContentView (PhoneWindow.java:256)
         В com.android.internal.policy.impl.PhoneWindow.setContentView (PhoneWindow.java)
         At android.app.Activity. $$ robo $$ Activity_c57b_setContentView (Activity.java:1867)
         At android.app.Activity.setContentView (Activity.java)
         At com.jch.latransit.MainActivity.onCreate (MainActivity.java:43)
         At android.app.Activity. $$ robo $$ Activity_c57b_performCreate (Activity.java:5008)
         В android.app.Activity.performCreate (Activity.java)
         At sun.reflect.NativeMethodAccessorImpl.invoke0 (родной метод)
         At sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:57)
         At sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
         В java.lang.reflect.Method.invoke (Method.java:606)
         At org.fest.reflect.method.Invoker.invoke (Invoker.java:112)
         At org.robolectric.util.ActivityController $ 1.run (ActivityController.java:116)
         At org.robolectric.shadows.ShadowLooper.runPaused (ShadowLooper.java:256)
         At org.robolectric.util.ActivityController.create (ActivityController.java:111)
         At org.robolectric.util.ActivityController.create (ActivityController.java:123)
         At com.jch.latransit.domain.TestTimeStamp.setUp (TestTimeStamp.java:33)
         At sun.reflect.NativeMethodAccessorImpl.invoke0 (родной метод)
         At sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:57)
         At sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
         В java.lang.reflect.Method.invoke (Method.java:606)
         ... еще 23
     Вызывается: java.lang.StringIndexOutOfBoundsException: индекс строки за пределами диапазона: -9
         В java.lang.String.substring (String.java:1911)
         At org.robolectric.res.ResName.qualifyResName (ResName.java:50)
         At org.robolectric.res.Attribute.getResourceReference (Attribute.java:138)
         At org.robolectric.res.Attribute.qualifiedValue (Attribute.java:127)
         At org.robolectric.res.builder.XmlFileBuilder $ XmlResourceParserImpl.qualify (XmlFileBuilder.java:316)
         At org.robolectric.res.builder.XmlFileBuilder $ XmlResourceParserImpl.getAttributeValue (XmlFileBuilder.java:340)
         At org.robolectric.shadows.ShadowResources.findAttributeValue (ShadowResources.java:257)
         At org.robolectric.shadows.ShadowResources.attrsToTypedArray (ShadowResources.java:193)
         At org.robolectric.shadows.ShadowResources.access $ 000 (ShadowResources.java:52)
         At org.robolectric.shadows.ShadowResources $ ShadowTheme.obtainStyledAttributes (ShadowResources.java:465)
         На android.content.res.Resources $ Theme.obtainStyledAttributes (Resources.java)
         В android.content.Context.obtainStyledAttributes (Context.java:374)
         В android.view.View .__ constructor __ (View.java:3297)
         At org.fest.reflect.method.Invoker.invoke (Invoker.java:112)
         At org.robolectric.shadows.ShadowView .__ constructor __ (ShadowView.java:61)
         На android.view.View. (View.java:3295)
         В android.view.ViewGroup. (ViewGroup.java:427)
         В android.widget.AdapterView. (AdapterView.java:235)
         В android.widget.AbsListView. (AbsListView.java:758)
         В android.widget.ListView. (ListView.java:141)
         В android.widget.ListView. (ListView.java:137)
         На android.view.LayoutInflater.createView (LayoutInflater.java:587)
         На org.robolectric.shadows.RoboLayoutInflater.onCreateView (RoboLayoutInflater.java:38)
         На android.view.LayoutInflater.onCreateView (LayoutInflater.java:660)
         На android.view.LayoutInflater.createViewFromTag (LayoutInflater.java:685)
         На android.view.LayoutInflater.rInflate (LayoutInflater.java:746)
         На android.view.LayoutInflater.inflate (LayoutInflater.java:489)
         На android.view.LayoutInflater.inflate (LayoutInflater.java:396)
         На android.view.LayoutInflater.inflate (LayoutInflater.java:352)
         В com.android.internal.policy.impl.PhoneWindow.setContentView (PhoneWindow.java:256)
         At android.app.Activity.setContentView (Activity.java:1867)
         At com.jch.latransit.MainActivity.onCreate (MainActivity.java:43)
         At android.app.Activity.performCreate (Activity.java:5008)
         At org.fest.reflect.method.Invoker.invoke (Invoker.java:112)
         At org.robolectric.util.ActivityController $ 1.run (ActivityController.java:116)
         At org.robolectric.shadows.ShadowLooper.runPaused (ShadowLooper.java:256)
         At org.robolectric.util.ActivityController.create (ActivityController.java:111)
         At org.robolectric.util.ActivityController.create (ActivityController.java:123)
         At com.jch.latransit.domain.TestTimeStamp.setUp (TestTimeStamp.java:33)
         ... еще 23

Вот мой activity_main.xml:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" > <ListView android:id="@+id/android:list" android:layout_width="match_parent" android:layout_height="0dip" android:layout_weight="1" android:fastScrollEnabled="true" > </ListView> <TextView android:id="@+id/android:empty" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> 

Вот метод onCreate (), который загружает activity_main.xml:

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mListAdapter = new ArrayAdapter<String>(this, R.layout.route_item, R.id.list_item); setListAdapter(mListAdapter); showProgDialog(this, "Loading routes..."); new GetRoutesTask().execute("http://" + getString(R.string.la_metro_query_host) + getString(R.string.la_metro_route_query)); } 

Основной причиной отказа является следующее:

 java.lang.StringIndexOutOfBoundsException: String index out of range: -9 

Я подозреваю, что Robolectric не разбирает ссылку android:id правильно. Попробуйте изменить идентификатор на что-то, сгенерированное в вашем проекте, например, android:id="+id/list" и посмотреть, работает ли ваш тест.

Поскольку Justin Muller прокомментировал мой первоначальный вопрос, есть еще одна проблема, которая правильно утверждает, что идентификатор ListView должен быть

 android:id="@android:id/list"