【问题标题】:Robolectric AndroidX fragments NoClassDefFoundErrorRobolectric AndroidX 片段 NoClassDefFoundError
【发布时间】:2019-01-05 18:12:51
【问题描述】:

在将代码和测试迁移到 AndroidX 之后,一切似乎都运行良好,但是由于 NoClassDefFoundError: androidx/fragment/testing/R$,两个片段的 Robolectric junit 测试失败了样式 例外。 堆栈跟踪:

java.lang.NoClassDefFoundError: androidx/fragment/testing/R$style at androidx.fragment.app.testing.FragmentScenario$EmptyFragmentActivity.onCreate(FragmentScenario.java:79) 在 android.app.Activity.performCreate(Activity.java:5933) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 在 androidx.test.runner.MonitoringInstrumentation.callActivityOnCreate(MonitoringInstrumentation.java:674) 在 org.robolectric.android.controller.ActivityController.lambda$create$0(ActivityController.java:69) 在 org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:365) 在 org.robolectric.android.controller.ActivityController.create(ActivityController.java:69) 在 org.robolectric.android.controller.ActivityController.create(ActivityController.java:74) 在 org.robolectric.android.internal.LocalActivityInvoker.startActivity(LocalActivityInvoker.java:39) 在 androidx.test.core.app.ActivityScenario.launch(ActivityScenario.java:207) 在 androidx.fragment.app.testing.FragmentScenario.internalLaunch(FragmentScenario.java:283) 在 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

还在 Google 的问题跟踪器中报告:https://issuetracker.google.com/issues/122321150

【问题讨论】:

    标签: android robolectric androidx androidx-test


    【解决方案1】:

    根据 Google 的回答,需要在测试 APK 中包含 androidx_fragment_test (androidx.fragment:fragment-testing:1.1.0-alpha03) 工件(不是在检测 APK 或测试依赖项中)。

    这意味着它必须作为 debugImplementation androix_fragment_test 添加到您的 build.gradle 文件中。

    如果您还在发布目标上运行测试,那么您必须添加 implementation androix_fragment_test

    您可以在 Google 的问题跟踪器中查看整个对话:https://issuetracker.google.com/issues/122321150

    【讨论】:

    • 如果我把它作为 debugImplementation 我得到java.lang.NoSuchMethodError: androidx.test.runner.MonitoringInstrumentation.restoreUncaughtExceptionHandler()V
    • 我对@m0skit0 有同样的问题。
    • 可能与这个问题有关。 github.com/robolectric/robolectric/issues/5092 使用 Robolectric 4.2.1,它对我有用。
    • 值得注意的是你必须使用debugImplementation,你不能对这个依赖使用testImplementation
    • 还值得注意的是androidx.test:coreandroidx.fragment:fragment-testing 的依赖项,因此必须相应地实现它
    猜你喜欢
    • 2020-03-22
    • 1970-01-01
    • 2013-03-19
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多