使用 Robolectric 测试 ListPreference 时出现 RuntimeException

RuntimeException when testing ListPreference with Robolectric

我正在尝试使用 Robolectric 3.0-RC3 对我的 PreferenceFragment 进行单元测试。我的首选项在 preferences.xml 文件中定义,并且有几个 ListPreference.

当我开始使用 FragmentTestUtil.startFragment(fragment) 测试我的片段时,方法 addPreferencesFromResource(R.xml.preferences) 在我的 PreferenceFragmentonCreate 方法中被调用。

我得到以下异常:

原因:java.lang.RuntimeException:嗯? ResName{com.myapp:array/pageOrientation_entries} 在 org.robolectric.shadows.Converter.convertAndFill(Converter.java:99) 在 org.robolectric.shadows.Converter.convertAndFill(Converter.java:50) 在 org.robolectric.shadows.ShadowResources.createTypedArray(ShadowResources.java:232) 在 org.robolectric.shadows.ShadowResources.attrsToTypedArray(ShadowResources.java:209) 在 org.robolectric.shadows.ShadowResources.access000 美元(ShadowResources.java:55) 在 org.robolectric.shadows.ShadowResources$ShadowTheme.obtainStyledAttributes(ShadowResources.java:485) 在 android.content.res.Resources$Theme.obtainStyledAttributes(Resources.java) 在 android.content.Context.obtainStyledAttributes(Context.java:472) 在android.preference.ListPreference.构造函数(ListPreference.java:49) 在 android.preference.ListPreference.(ListPreference.java) 在 android.preference.GenericInflater.createItem(GenericInflater.java:383) 在 android.preference.GenericInflater.onCreateItem(GenericInflater.java:417) 在 android.preference.GenericInflater.createItemFromTag(GenericInflater.java:428) 在 android.preference.GenericInflater.rInflate(GenericInflater.java:481) 在 android.preference.GenericInflater.rInflate(GenericInflater.java:493) 在 android.preference.GenericInflater.inflate(GenericInflater.java:326) 在 android.preference.GenericInflater.inflate(GenericInflater.java:263) 在 android.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:272) 在 android.preference.PreferenceFragment.addPreferencesFromResource(PreferenceFragment.java:299) 在 com.myapp.ui.settings.SettingsFragment.onCreate(SettingsFragment.java:53) 在 android.app.Fragment.performCreate(Fragment.java:2031) 在 android.app.FragmentManagerImpl.moveToState(FragmentManager.java:863) 在 android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) 在 android.app.BackStackRecord.run(BackStackRecord.java:833) 在 android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452) 在 android.app.FragmentManagerImpl$1.run(FragmentManager.java:447) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 org.robolectric.shadows.ShadowMessageQueue.dispatchMessage(ShadowMessageQueue.java:130) 在 org.robolectric.shadows.ShadowMessageQueue.access100 美元(ShadowMessageQueue.java:29) 在 org.robolectric.shadows.ShadowMessageQueue$1.run(ShadowMessageQueue.java:95) 在 org.robolectric.util.Scheduler.runOrQueueRunnable(Scheduler.java:230) 在 org.robolectric.util.Scheduler.postAtFrontOfQueue(Scheduler.java:98) 在 org.robolectric.shadows.ShadowMessageQueue.enqueueMessage(ShadowMessageQueue.java:114) 在 android.os.MessageQueue.enqueueMessage(MessageQueue.java) 在 android.os.Handler.enqueueMessage(Handler.java:631) 在 android.os.Handler.sendMessageAtTime(Handler.java:600) 在 android.os.Handler.sendMessageDelayed(Handler.java:570) 在 android.os.Handler.post(Handler.java:326) 在 android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1358) 在 android.app.BackStackRecord.commitInternal(BackStackRecord.java:728) 在 android.app.BackStackRecord.commit(BackStackRecord.java:704) 在 org.robolectric.util.FragmentTestUtil.startFragment(FragmentTestUtil.java:14) 在 com.myapp.ui.settings.SettingsFragmentTest.startFragment(SettingsFragmentTest.java:40) 在 com.myapp.ui.settings.SettingsFragmentTest.plusFeaturesDisabled_onSignaturePrefClick(SettingsFragmentTest.java:70) ... 还有 18 个

当我注释掉所有ListPreference并保留其他类型的偏好时,我没有这个问题。

感谢您的帮助。

Robolectric 3.0 似乎在处理通用数组资源方面存在问题,例如:

<array>
  <item>Option 1</item>
</array>

就我而言,我可以通过将其显式更改为正确的数组类型来解决问题:

<string-array>
  <item>Option 1</item>
</string-array>