我最近迁移了我的首选项实现以使用androidx.preference
。这导致我的一项仪器测试失败,并且我没有找到合理的解决方法来使它通过。
在测试中,如果满足应用程序首选项中的某些条件,我将显示一个对话框,显示错误。在此测试中,将禁用特定的首选项。用户可以单击错误以打开特定的首选项,然后进入并进行更改。问题是我不知道如何断言是否显示了正确的PreferenceFragment。
失败的测试看起来像这样:
@Test
fun whenWorklistNotEnabled_shouldDisplayWorklistNotEnabledMessage() {
val manager = PreferenceManagerImpl(InstrumentationRegistry.getInstrumentation().targetContext)
whenever(preferenceManagerSpy.worklistEnabled).thenReturn(false)
whenever(preferenceManagerSpy.openDicomSettings()).thenAnswer { manager.openWorklistSettings() }
launchWorklistDialog()
onView(withErrorMessageView(R.id.dialog_worklist_errorview))
.check(
matches(
allOf(
isDisplayed(),
withPrimaryErrorText(R.string.global_worklist_disabled_error),
withSecondaryErrorText(R.string.dialog_worklist_worklist_disabled_error_secondary_text)
)
)
)
.perform(ErrorMessageViewActions.actionOnSecondaryTextContainer(click()))
intended(
allOf<Intent>(
IntentMatchers.hasComponent(
ComponentName(
InstrumentationRegistry.getInstrumentation().targetContext,
SettingsActivity::class.java
)
),
IntentMatchers.hasExtra(
PreferenceActivity.EXTRA_SHOW_FRAGMENT,
WorklistFragment::class.java
)
)
)
}
但是当您不再使用PreferenceActivity实现时,如何重写它以匹配特定的PreferenceFragment?
Recorded intents:
-Intent { cmp=com.example/.preferences.SettingsActivity (has extras) } handling packages:[[com.example]], extras:[Bundle[{EXTRA_SHOW_DICOM_FRAGMENT=class com.example.preferences.WorklistFragment}]])
解决方案:
intended(
allOf<Intent>(
IntentMatchers.hasComponent(
ComponentName(
InstrumentationRegistry.getInstrumentation().targetContext,
SettingsActivity::class.java
)
),
IntentMatchers.hasExtra(
EXTRA_SHOW_WORKLIST_FRAGMENT,
WorklistFragment::class.java
)
)
)