尝试使用 Gradle、Robolectric 和 Travis CI 测试 Android 应用程序时出现 NoClassDefFoundError
NoClassDefFoundError when trying to test Android app with Gradle, Robolectric and Travis CI
在使用 Travis CI 测试带有 Robolectric 和 Gradle 的 Android 应用程序时,我总是 运行 进入 NoClassDefFoundError
。
所有测试都在 Android Studio 中通过。所以我猜这是一个 Travis 特定的配置问题。在 运行 Robolectric 中使用 Gradle 和 Travis 进行过测试吗?
我有以下内容。travis.yml:
language: android
android:
components:
- platform-tools
- tools
- build-tools-21.1.2
- android-21
- extra-android-m2repository
licenses:
- android-sdk-license-.+
notifications:
email: false
script: ./gradlew clean test
以及以下Robolectric具体build.gradle:
apply plugin: 'robolectric'
robolectric {
include '**/*Test.class'
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:21.0.3'
androidTestCompile 'junit:junit:4.8.1'
androidTestCompile 'org.robolectric:robolectric:3.0-SNAPSHOT'
androidTestCompile 'com.squareup.assertj:assertj-android:1.0.0'
}
这是我的 GitHub 回购:
https://github.com/a11n/android-travis-test/tree/travis-configuration-test
这是 Travis 日志:
https://travis-ci.org/a11n/android-travis-test/builds/49715336
de.ad.android.app.MainActivityTest > testLifecycle FAILED
java.lang.NoClassDefFoundError at MainActivityTest.java:19
Caused by: java.lang.ClassNotFoundException at MainActivityTest.java:19
似乎 Android 依赖无法解决。
有什么想法吗?
更新 1:
使用 --debug 标志,日志发现 class 找不到:
15:45:33.082 [DEBUG] [TestEventLogger] Caused by:
15:45:33.082 [DEBUG] [TestEventLogger] java.lang.ClassNotFoundException: android.support.v4.view.OnApplyWindowInsetsListener
15:45:33.083 [DEBUG] [TestEventLogger] at org.robolectric.internal.bytecode.InstrumentingClassLoader.getByteCode(InstrumentingClassLoader.java:166)
15:45:33.083 [DEBUG] [TestEventLogger] at org.robolectric.internal.bytecode.InstrumentingClassLoader.findClass(InstrumentingClassLoader.java:123)
15:45:33.083 [DEBUG] [TestEventLogger] at org.robolectric.internal.bytecode.InstrumentingClassLoader.loadClass(InstrumentingClassLoader.java:95)
15:45:33.083 [DEBUG] [TestEventLogger] at android.support.v7.app.ActionBarActivityDelegate.$$robo$$ActionBarActivityDelegate_7c55_createDelegate(ActionBarActivityDelegate.java:51)
15:45:33.083 [DEBUG] [TestEventLogger] at android.support.v7.app.ActionBarActivityDelegate.createDelegate(ActionBarActivityDelegate.java)
15:45:33.084 [DEBUG] [TestEventLogger] at android.support.v7.app.ActionBarActivity.$$robo$$ActionBarActivity_eab0_getDelegate(ActionBarActivity.java:557)
15:45:33.084 [DEBUG] [TestEventLogger] at android.support.v7.app.ActionBarActivity.getDelegate(ActionBarActivity.java)
15:45:33.084 [DEBUG] [TestEventLogger] at android.support.v7.app.ActionBarActivity.$$robo$$ActionBarActivity_eab0_onCreate(ActionBarActivity.java:123)
15:45:33.084 [DEBUG] [TestEventLogger] at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java)
我会朝这个方向进一步调查一下,也许这是一个已知的 Robolectric 问题。
更新二:
AppCompat v7 似乎有问题。 https://github.com/robolectric/robolectric-samples/commit/85e21dcde99bc860ad91bcf2b4e3605bc267fcaa
但是,我尝试删除此依赖项并检查 Travis 构建是否通过。
我刚查过。你可以在你旁边添加应用 build.gradle
:
android {
...
sourceSets {
androidTest.setRoot( 'src/androidTest' )
}
}
dependencies {
compile 'com.android.support:support-v4:21.0.3'
androidTestCompile 'com.android.support:support-v4:21.0.3'
}
此问题是由 AppCompat v7 引起的。依赖性似乎是 Travis CI.
的一个已知问题
对于上面的用例,删除依赖关系解决了问题。
在使用 Travis CI 测试带有 Robolectric 和 Gradle 的 Android 应用程序时,我总是 运行 进入 NoClassDefFoundError
。
所有测试都在 Android Studio 中通过。所以我猜这是一个 Travis 特定的配置问题。在 运行 Robolectric 中使用 Gradle 和 Travis 进行过测试吗?
我有以下内容。travis.yml:
language: android
android:
components:
- platform-tools
- tools
- build-tools-21.1.2
- android-21
- extra-android-m2repository
licenses:
- android-sdk-license-.+
notifications:
email: false
script: ./gradlew clean test
以及以下Robolectric具体build.gradle:
apply plugin: 'robolectric'
robolectric {
include '**/*Test.class'
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:21.0.3'
androidTestCompile 'junit:junit:4.8.1'
androidTestCompile 'org.robolectric:robolectric:3.0-SNAPSHOT'
androidTestCompile 'com.squareup.assertj:assertj-android:1.0.0'
}
这是我的 GitHub 回购: https://github.com/a11n/android-travis-test/tree/travis-configuration-test
这是 Travis 日志: https://travis-ci.org/a11n/android-travis-test/builds/49715336
de.ad.android.app.MainActivityTest > testLifecycle FAILED
java.lang.NoClassDefFoundError at MainActivityTest.java:19
Caused by: java.lang.ClassNotFoundException at MainActivityTest.java:19
似乎 Android 依赖无法解决。
有什么想法吗?
更新 1:
使用 --debug 标志,日志发现 class 找不到:
15:45:33.082 [DEBUG] [TestEventLogger] Caused by:
15:45:33.082 [DEBUG] [TestEventLogger] java.lang.ClassNotFoundException: android.support.v4.view.OnApplyWindowInsetsListener
15:45:33.083 [DEBUG] [TestEventLogger] at org.robolectric.internal.bytecode.InstrumentingClassLoader.getByteCode(InstrumentingClassLoader.java:166)
15:45:33.083 [DEBUG] [TestEventLogger] at org.robolectric.internal.bytecode.InstrumentingClassLoader.findClass(InstrumentingClassLoader.java:123)
15:45:33.083 [DEBUG] [TestEventLogger] at org.robolectric.internal.bytecode.InstrumentingClassLoader.loadClass(InstrumentingClassLoader.java:95)
15:45:33.083 [DEBUG] [TestEventLogger] at android.support.v7.app.ActionBarActivityDelegate.$$robo$$ActionBarActivityDelegate_7c55_createDelegate(ActionBarActivityDelegate.java:51)
15:45:33.083 [DEBUG] [TestEventLogger] at android.support.v7.app.ActionBarActivityDelegate.createDelegate(ActionBarActivityDelegate.java)
15:45:33.084 [DEBUG] [TestEventLogger] at android.support.v7.app.ActionBarActivity.$$robo$$ActionBarActivity_eab0_getDelegate(ActionBarActivity.java:557)
15:45:33.084 [DEBUG] [TestEventLogger] at android.support.v7.app.ActionBarActivity.getDelegate(ActionBarActivity.java)
15:45:33.084 [DEBUG] [TestEventLogger] at android.support.v7.app.ActionBarActivity.$$robo$$ActionBarActivity_eab0_onCreate(ActionBarActivity.java:123)
15:45:33.084 [DEBUG] [TestEventLogger] at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java)
我会朝这个方向进一步调查一下,也许这是一个已知的 Robolectric 问题。
更新二:
AppCompat v7 似乎有问题。 https://github.com/robolectric/robolectric-samples/commit/85e21dcde99bc860ad91bcf2b4e3605bc267fcaa
但是,我尝试删除此依赖项并检查 Travis 构建是否通过。
我刚查过。你可以在你旁边添加应用 build.gradle
:
android {
...
sourceSets {
androidTest.setRoot( 'src/androidTest' )
}
}
dependencies {
compile 'com.android.support:support-v4:21.0.3'
androidTestCompile 'com.android.support:support-v4:21.0.3'
}
此问题是由 AppCompat v7 引起的。依赖性似乎是 Travis CI.
的一个已知问题对于上面的用例,删除依赖关系解决了问题。