[英]How do I structure my Android Studio project to avoid compilation issues with running the app with unit tests integrated
I am running the latest version of Robolectric, Android Studio, and Gradle.我正在运行最新版本的 Robolectric、Android Studio 和 Gradle。
As the title suggests ever since I worked on Robolectric test cases, I am having a hard time switching back to app and making the android app compile like it used to be.正如标题所暗示的,自从我从事 Robolectric 测试用例以来,我很难切换回应用程序并使 android 应用程序像以前一样编译。
Every time I try to run the app, I get the following compilation errors:每次尝试运行该应用程序时,都会出现以下编译错误:
Error:(35, 23) error: package org.robolectric does not exist
Error:(36, 23) error: package org.robolectric does not exist
Error:(37, 34) error: package org.robolectric.annotation does not exist
Error:(38, 42) error: package org.robolectric.shadows.httpclient does not exist
Error:(44, 2) error: cannot find symbol class Config
Error:(43, 10) error: cannot find symbol class RobolectricTestRunner
Error:(197, 13) error: cannot find symbol variable FakeHttp
Error:(198, 13) error: cannot find symbol variable FakeHttp
Error:(218, 9) error: cannot find symbol variable FakeHttp
Error:(238, 25) error: cannot find symbol variable Robolectric
Error:(250, 25) error: cannot find symbol variable Robolectric
Error:(260, 25) error: cannot find symbol variable Robolectric
Error:(263, 28) error: cannot find symbol variable Robolectric
Error:(275, 38) error: cannot find symbol variable Robolectric
Error:(291, 25) error: cannot find symbol variable Robolectric
Error:(294, 28) error: cannot find symbol variable Robolectric
Error:(305, 32) error: cannot find symbol variable Robolectric
Error:(317, 25) error: cannot find symbol variable Robolectric
Here is my gradle file:这是我的gradle文件:
sourceSets{
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
java.exclude {'src/test'}
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
test {
java.srcDirs = ['src/test/java']
}
// Move the build types to build-types/<type>
// For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
// This moves them out of them default location under src/<type>/... which would
// conflict with src/ being used by the main source set.
// Adding new build types or product flavors should be accompanied
// by a similar customization.
debug.setRoot('build-types/debug')
release.setRoot('build-types/release')
}
dependencies {
compile fileTree(include: '*.jar', dir: 'libs')
compile('com.facebook.android:facebook-android-sdk:3.22.0@aar') {
exclude module: 'support-v4'
}
compile files('libs/universal-image-loader-1.9.5.jar')
compile('com.crashlytics.sdk.android:crashlytics:2.5.0@aar') {
transitive = true;
}
compile files('libs/KochavaSDK.jar')
compile files('libs/Parse-1.9.1.jar')
compile files('libs/picasso-2.4.0.jar')
compile files('libs/adobeMobileLibrary-4.11.0.jar')
compile project(':cardview')
compile project(':CropImage')
compile project(':MapboxAndroidSDKNew')
compile project(':android-pdfview')
compile project(':UserVoiceSDK')
compile 'com.google.android.gms:play-services:9.2.1'
compile 'com.google.firebase:firebase-messaging:9.2.1'
compile 'com.parse.bolts:bolts-android:1.+'
compile 'com.android.support:design:23.0.1'
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.android.support:recyclerview-v7:23.0.1'
compile 'com.fasterxml.jackson.core:jackson-databind:2.5.+'
compile 'com.fasterxml.jackson.core:jackson-core:2.5.+'
compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
compile 'com.nineoldandroids:library:2.4.0'
compile 'com.android.support:multidex:1.0.1'
compile 'com.android.support:support-v13:23.0.1'
compile('com.googlecode.json-simple:json-simple:1.1.1') {
exclude group: 'org.hamcrest', module: 'hamcrest-core'
}
compile 'junit:junit:4.12'
testCompile 'junit:junit:4.12'
testCompile 'org.robolectric:robolectric:3.1.2'
testCompile 'org.robolectric:shadows-multidex:3.1.2'
testCompile 'org.robolectric:shadows-httpclient:3.1.2'
}
For the current file structure, I have set the test and com.example.application folders underneath the src folder, which was causing these compilation issues.对于当前的文件结构,我在 src 文件夹下设置了 test 和 com.example.application 文件夹,这导致了这些编译问题。
I am aware that there are some work arounds for this fix, which consists of excluding the test folder by using 'java { exclude 'src/test'}' under the main sourceset, but I tried that and it didn't seem to work.我知道此修复程序有一些变通方法,包括通过在主源集下使用“java { exclude 'src/test'}”排除测试文件夹,但我尝试过,但它似乎不起作用. I also tried to add compile 'org.robolectric:robolectric:3.1.2' and other robolectric libraries needed, but it's gotten too bothersome and now I need to set this project up properly to where I can achieve this desirable effect.我还尝试添加 compile 'org.robolectric:robolectric:3.1.2' 和其他需要的 robolectric 库,但它太麻烦了,现在我需要正确设置这个项目,以达到理想的效果。
Any input is greatly appreciated.非常感谢任何输入。
EDIT: Reworded this question a little better.编辑:改写这个问题好一点。
Change java.exclude {'src/test'}
in the sourceSets
block to java.exclude 'test/**'
将sourceSets
块中的java.exclude {'src/test'}
sourceSets
为java.exclude 'test/**'
The original way was calling exclude with a Closure
argument , a closure which always returned true, which meant exclude everything.最初的方法是使用Closure
参数调用 exclude ,一个始终返回 true 的闭包,这意味着排除所有内容。
you may also want to pair it with java.include '**/*.java'
(before the exclude) and resources.exclude '**/*.java'
in the future. java.include '**/*.java'
您可能还想将它与java.include '**/*.java'
(在排除之前)和resources.exclude '**/*.java'
配对。 Not sure what your build is like but tasks like processResources
may change because of it.不确定您的构建是什么样的,但processResources
类的任务可能会因此而改变。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.