【问题标题】:java.lang.NoClassDefFoundError: android.databinding.DataBinderMapperImpl when running Espresso testsjava.lang.NoClassDefFoundError: android.databinding.DataBinderMapperImpl 运行 Espresso 测试时
【发布时间】:2018-09-14 04:56:26
【问题描述】:

数据绑定设置:

apply plugin: 'kotlin-kapt'

android {
    dataBinding {
        enabled = true
    }
}

dependencies {
    kapt "com.android.databinding:compiler:3.1.0"
}

使用数据绑定的片段类:

class LandingFragment : Fragment(), Injectable {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {
        val dataBinding = LandingFragmentBinding.inflate(inflater, container, false)
        return dataBinding.root
    }
}

每次对此片段运行 Espresso 测试时,我都会收到以下异常:

java.lang.NoClassDefFoundError: android.databinding.DataBinderMapperImpl
at android.databinding.DataBindingUtil.<clinit>(DataBindingUtil.java:32)
at com.sc.databinding.LandingFragmentBinding.inflate(LandingFragmentBinding.java:42)
at com.sc.ui.landing.LandingFragment.onCreateView(LandingFragment.kt:32)
...

【问题讨论】:

  • 您的模块中是否启用了数据绑定?
  • 我只有一个模块“app”。
  • 你解决了吗?
  • 是的,我做到了,但我不记得究竟是怎么回事,问题在某个时候自行消失了。

标签: android data-binding kotlin android-espresso


【解决方案1】:

有点晚了,但我通过添加带有 kapt 的 DataBinding 编译器作为测试依赖项解决了这个问题:

kaptAndroidTest 'androidx.databinding:databinding-compiler:3.3.2'

如果您的项目还没有使用 Jetpack,则不是来自 AndroidX 的版本。

【讨论】:

  • 经过一小时的搜索,我找到了这个。成就了我的一天。谢谢。
  • 为什么这是必要的?它有什么作用?如果这似乎无法解决问题,请尝试清理您的构建目录。我也不确定为什么会这样。
  • 哥们,你用的是PayPal还是什么的? :D
【解决方案2】:

添加

kaptTest "androidx.databinding:databinding-compiler:+"

dependencies build.gradle 您所有模块的文件。

【讨论】:

    【解决方案3】:

    我遇到了这个错误。我做了两件事: 1. gradle 新增 kaptAndroidTest 'androidx.databinding:databinding-compiler:3.5.1' 2.使用了数据绑定,也就是说,我创建了一个假的bool变量,并将它真实注入到一个视图中。您似乎不能只使用数据绑定来检索视图,而不是发出可怕的 findViewById。您必须在模块中至少使用一次。一旦你使用它,你对模块中的所有其他类都很好。

    【讨论】:

    • 你能再解释一下吗?
    【解决方案4】:

    我也有同样的问题,通过添加解决了

    kapt {
        generateStubs = true
    }
    

    在 build.gradle 应用程序中(所有模块,如果使用 dataBinding)

    apply plugin: 'kotlin-kapt'
    
    android {
    ...
        dataBinding {
            enabled = true
        }
    }
    
    kapt {
        generateStubs = true
    }
    
    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        ...
        implementation "androidx.core:core-ktx:+"
        implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
        kapt "com.android.databinding:compiler:$android_plugin_version"
    
    }
    

    在 build.gradle 项目中

    buildscript {
        ext.kotlin_version = '1.3.70'
        ext.android_plugin_version = '3.5.2'
        repositories {
            google()
            jcenter()
    
        }
        dependencies {
            classpath "com.android.tools.build:gradle:$android_plugin_version"
            classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        }
    }
    

    【讨论】:

      【解决方案5】:

      尝试按照thisstackoverflow 回答添加android-apt插件:

      classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
      

      【讨论】:

      • 我使用 kapt 注释处理器(你可以从我的 Gradle 配置中看到它)。为什么需要第三方注释处理器?
      猜你喜欢
      • 1970-01-01
      • 2019-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多