【发布时间】:2023-01-30 22:10:51
【问题描述】:
我正在尝试在 androidTest 源集中运行 launchFragmentInHiltContainer。 在代码片段下方运行会导致标题中提到的错误。
@Test
fun mainActivityTest(){
val scenario = launchFragmentInHiltContainer<CoinInfoFragment> { }
}
函数 launchFragmentInHiltContainer:
@ExperimentalCoroutinesApi
inline fun <reified T : Fragment> launchFragmentInHiltContainer(
fragmentArgs: Bundle? = null,
themeResId: Int = androidx.fragment.testing.R.style.FragmentScenarioEmptyFragmentActivityTheme,
fragmentFactory: FragmentFactory? = null,
crossinline action: T.() -> Unit = {}
) {
val mainActivityIntent = Intent.makeMainActivity(
ComponentName(
ApplicationProvider.getApplicationContext(),
HiltTestActivity::class.java
)
).putExtra(FragmentScenario.EmptyFragmentActivity.THEME_EXTRAS_BUNDLE_KEY, themeResId)
ActivityScenario.launch<HiltTestActivity>(mainActivityIntent).onActivity { activity ->
fragmentFactory?.let {
activity.supportFragmentManager.fragmentFactory = it
}
val fragment = activity.supportFragmentManager.fragmentFactory.instantiate(
Preconditions.checkNotNull(T::class.java.classLoader),
T::class.java.name
)
fragment.arguments = fragmentArgs
activity.supportFragmentManager.beginTransaction()
.add(android.R.id.content, fragment, "")
.commitNow()
(fragment as T).action()
}
}
我试图通过以下解决方案解决问题:
- Android Lint:关闭 Missing PendingIntent 可变性,
- 添加:
// Kotlin + coroutines
implementation "androidx.work:work-runtime-ktx:$work_version"
// optional - Test helpers
androidTestImplementation "androidx.work:work-testing:$work_version"
错误堆栈跟踪:
java.lang.IllegalArgumentException: com.example.cointracker: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.
at android.app.PendingIntent.checkFlags(PendingIntent.java:375)
at android.app.PendingIntent.getActivityAsUser(PendingIntent.java:458)
at android.app.PendingIntent.getActivity(PendingIntent.java:444)
at android.app.PendingIntent.getActivity(PendingIntent.java:408)
at androidx.test.core.app.InstrumentationActivityInvoker.startActivity(InstrumentationActivityInvoker.java:406)
at androidx.test.core.app.InstrumentationActivityInvoker.startActivity(InstrumentationActivityInvoker.java:416)
at androidx.test.core.app.ActivityScenario.launchInternal(ActivityScenario.java:265)
at androidx.test.core.app.ActivityScenario.launch(ActivityScenario.java:226)
at com.example.cointracker.presentation.CoinsFragmentTest.mainActivityTest(CoinsFragmentTest.kt:116)
没有任何帮助。有谁知道如何解决这个错误?
【问题讨论】:
-
PendingIntent 在您的代码中的何处初始化?你能提供吗?
-
这是一个很好的问题,错误即将出现在 inlineFunction 中的 ActivityScenario。我编辑了问题并添加了错误堆栈跟踪。
标签: android android-testing android-pendingintent android-fragmentscenario