在将代码和测试迁移到AndroidX后,所有似乎都运行良好,但是由于NoClassDefFoundError:两个片段的Robolectric junit测试失败:androidx / fragment / testing / R $样式异常.
堆栈跟踪:
java.lang.NoClassDefFoundError: androidx/fragment/testing/R$style at
androidx.fragment.app.testing.FragmentScenario$EmptyFragmentActivity.onCreate(FragmentScenario.java:79)
at android.app.Activity.performCreate(Activity.java:5933) at
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at
androidx.test.runner.MonitoringInstrumentation.callActivityOnCreate(MonitoringInstrumentation.java:674)
at
org.robolectric.android.controller.ActivityController.lambda$create$0(ActivityController.java:69)
at
org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:365)
at
org.robolectric.android.controller.ActivityController.create(ActivityController.java:69)
at
org.robolectric.android.controller.ActivityController.create(ActivityController.java:74)
at
org.robolectric.android.internal.LocalActivityInvoker.startActivity(LocalActivityInvoker.java:39)
at
androidx.test.core.app.ActivityScenario.launch(ActivityScenario.java:207)
at
androidx.fragment.app.testing.FragmentScenario.internalLaunch(FragmentScenario.java:283)
at
androidx.fragment.app.testing.FragmentScenario.launchInContainer(FragmentScenario.java:265)
为了测试我正在使用FragmentScenario的片段,似乎FragmentScenario.EmptyFragmentActivity引用了一个包androidx.fragment.testing.R中缺少的R类:
setTheme(getIntent().getIntExtra(THEME_EXTRAS_BUNDLE_KEY,
R.style.FragmentScenarioEmptyFragmentActivityTheme));
知道什么可能是错的吗?也许我错过了对我来说不那么明显的依赖.
可在以下项目中重现:
https://github.com/marcinbak/androidx-test-error
谷歌的问题跟踪器也报道了:https://issuetracker.google.com/issues/122321150
解决方法:
根据谷歌的回答,需要在测试APK中包含androidx_fragment_test(androidx.fragment:fragment-testing:1.1.0-alpha03)工件(不在仪器APK或测试依赖项中).
这意味着它必须在build.gradle文件中添加为debugImplementation androix_fragment_test.
如果您还在发布目标上运行测试,则必须添加实现androix_fragment_test.
您可以在Google的问题跟踪器中看到整个对话:https://issuetracker.google.com/issues/122321150