java.lang.NoClassDefFoundError:运行Espresso测试时的android.databinding.DataBinderMapperImpl

时间:2018-04-04 14:55:26

标签: android data-binding kotlin android-espresso

数据绑定设置:

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)
...

5 个答案:

答案 0 :(得分:4)

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

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

或者如果您的项目尚未使用Jetpack,则不是AndroidX版本。

答案 1 :(得分:1)

添加

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我有同样的问题,并通过添加

来解决
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"
    }
}

答案 4 :(得分:-1)

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

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