在没有 Multidexing 的情况下使用 Robolectric?
Using Robolectric without Multidexing?
我正在开发 Android 应用程序,我想使用 Robolectric 进行测试。
我遇到的主要问题是,每当我将 Robolectric(和其他一些测试库)包含到我的 gradle.build 文件中时,我都会收到 Dex 错误,因此我需要启用多索引库(我在 Android 4.4
).
上工作
因此,我无法再编译了,它花费的时间太长了。没有 Robolectric 和 multidex,编译可能需要一分钟,而在包含 Robolectric 和 multidex 的情况下,超过 30 分钟后我什么也得不到。
这是我的完整 gradle 文件:
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "cm.smobilpay.testapp"
minSdkVersion 19
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
debug {
debuggable true
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
testCoverageEnabled true
multiDexEnabled true
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
testCoverageEnabled false
}
}
productFlavors {
unitTest // Creates a new scope which wraps only unit tests
}
sourceSets {
unitTest {
java {
srcDir 'src/test/java' // New scope includes our unit test folder
}
}
}
// Prevent conflicts between Robolectric's dependencies
packagingOptions {
exclude 'META-INF/DEPENDENCIES.txt'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/notice.txt'
exclude 'META-INF/license.txt'
exclude 'META-INF/dependencies.txt'
exclude 'META-INF/LGPL2.1'
exclude 'LICENSE.txt'
exclude 'LICENSE'
}
lintOptions {
abortOnError false
xmlReport true
}
}
repositories {
flatDir {
dirs 'libs'
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile(name:'s3papiandroidclient', ext:'aar')
compile 'com.android.support:appcompat-v7:22.2.0'
compile 'com.squareup.retrofit:retrofit:1.9.0'
compile 'joda-time:joda-time:2.8.1'
compile 'com.android.support:multidex:1.0.0'
// Unit testing dependencies
testCompile group: 'org.hamcrest', name: 'hamcrest-core', version: '1.3'
testCompile group: 'junit', name: 'junit-dep', version: '4.10'
testCompile group: 'org.hamcrest', name: 'hamcrest-library', version: '1.3'
unitTestCompile('org.robolectric:robolectric:3.0-rc3') {
exclude module: 'classworlds'
exclude module: 'commons-logging'
exclude module: 'httpclient'
exclude module: 'maven-artifact'
exclude module: 'maven-artifact-manager'
exclude module: 'maven-error-diagnostics'
exclude module: 'maven-model'
exclude module: 'maven-project'
exclude module: 'maven-settings'
exclude module: 'plexus-container-default'
exclude module: 'plexus-interpolation'
exclude module: 'plexus-utils'
exclude module: 'wagon-file'
exclude module: 'wagon-http-lightweight'
exclude module: 'wagon-provider-api'
}
}
我的问题是:我做错了什么导致我在将 Robolectric 包含到我的项目时被迫使用 multidex?
Robolectric 根本不应包含在您的 dex 中。 Robolectric 在 JVM 上测试 运行,它们不会部署到设备上。
您应该将其包含在 testCompile
中,如 the docs 中所述。
testCompile "org.robolectric:robolectric:3.0"
我正在开发 Android 应用程序,我想使用 Robolectric 进行测试。
我遇到的主要问题是,每当我将 Robolectric(和其他一些测试库)包含到我的 gradle.build 文件中时,我都会收到 Dex 错误,因此我需要启用多索引库(我在 Android 4.4
).
因此,我无法再编译了,它花费的时间太长了。没有 Robolectric 和 multidex,编译可能需要一分钟,而在包含 Robolectric 和 multidex 的情况下,超过 30 分钟后我什么也得不到。
这是我的完整 gradle 文件:
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "cm.smobilpay.testapp"
minSdkVersion 19
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
debug {
debuggable true
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
testCoverageEnabled true
multiDexEnabled true
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
testCoverageEnabled false
}
}
productFlavors {
unitTest // Creates a new scope which wraps only unit tests
}
sourceSets {
unitTest {
java {
srcDir 'src/test/java' // New scope includes our unit test folder
}
}
}
// Prevent conflicts between Robolectric's dependencies
packagingOptions {
exclude 'META-INF/DEPENDENCIES.txt'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/notice.txt'
exclude 'META-INF/license.txt'
exclude 'META-INF/dependencies.txt'
exclude 'META-INF/LGPL2.1'
exclude 'LICENSE.txt'
exclude 'LICENSE'
}
lintOptions {
abortOnError false
xmlReport true
}
}
repositories {
flatDir {
dirs 'libs'
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile(name:'s3papiandroidclient', ext:'aar')
compile 'com.android.support:appcompat-v7:22.2.0'
compile 'com.squareup.retrofit:retrofit:1.9.0'
compile 'joda-time:joda-time:2.8.1'
compile 'com.android.support:multidex:1.0.0'
// Unit testing dependencies
testCompile group: 'org.hamcrest', name: 'hamcrest-core', version: '1.3'
testCompile group: 'junit', name: 'junit-dep', version: '4.10'
testCompile group: 'org.hamcrest', name: 'hamcrest-library', version: '1.3'
unitTestCompile('org.robolectric:robolectric:3.0-rc3') {
exclude module: 'classworlds'
exclude module: 'commons-logging'
exclude module: 'httpclient'
exclude module: 'maven-artifact'
exclude module: 'maven-artifact-manager'
exclude module: 'maven-error-diagnostics'
exclude module: 'maven-model'
exclude module: 'maven-project'
exclude module: 'maven-settings'
exclude module: 'plexus-container-default'
exclude module: 'plexus-interpolation'
exclude module: 'plexus-utils'
exclude module: 'wagon-file'
exclude module: 'wagon-http-lightweight'
exclude module: 'wagon-provider-api'
}
}
我的问题是:我做错了什么导致我在将 Robolectric 包含到我的项目时被迫使用 multidex?
Robolectric 根本不应包含在您的 dex 中。 Robolectric 在 JVM 上测试 运行,它们不会部署到设备上。
您应该将其包含在 testCompile
中,如 the docs 中所述。
testCompile "org.robolectric:robolectric:3.0"