java - 如何构建我的 Android Studio 项目以避免在运行集成了单元测试的应用程序时出现编译问题

标签 java android unit-testing gradle robolectric

我正在运行最新版本的 Robolectric、Android Studio 和 Gradle。

正如标题所暗示的那样,自从我从事 Robolectric 测试用例以来,我很难切换回应用程序并使 Android 应用程序像以前一样编译。

每次我尝试运行该应用程序时,我都会收到以下编译错误:

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

这是我的 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'

}

对于当前的文件结构,我在 src 文件夹下设置了 test 和 com.example.application 文件夹,这导致了这些编译问题。

我知道这个修复有一些解决方法,包括在主源集下使用“java { exclude 'src/test'}”排除测试文件夹,但我试过了但没有成功似乎工作。我还尝试添加 compile 'org.robolectric:robolectric:3.1.2' 和其他所需的 robolectric 库,但它变得太麻烦了,现在我需要正确地设置这个项目以达到我想要的效果。

非常感谢任何输入。

编辑:改写这个问题好一点。

最佳答案

sourceSets block 中的 java.exclude {'src/test'} 更改为 java.exclude 'test/**'

最初的方法是用 Closure argument 调用排除,一个始终返回 true 的闭包,这意味着排除所有内容。

您可能还想将它与 java.include '**/*.java'(在排除之前)和 resources.exclude '**/*.java' 在未来。不确定您的构建是什么样的,但任务类似于 processResources可能因此而改变。

关于java - 如何构建我的 Android Studio 项目以避免在运行集成了单元测试的应用程序时出现编译问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39479304/

相关文章:

android - 查找 TextView 的文本大小

node.js - 在光谱测试中选择选项

java - JDBC - 无法远程连接到 MySQL 服务器

java - IntelliJ IDEA 17 - ASM 字节码大纲不起作用

java - Apache Camel Sticky Http 路由

android - 读取文本文件并将其存储在数组中(Android 开发)

android - 无法使用扩展 SeekBar 的自己的类运行 android 应用程序

java - AndEngine - X 秒后杀死 Sprite?

unit-testing - 只有在单元测试成功后,Maven 多模块才会部署到存储库

unit-testing - Grails中的Micronaut声明式客户端:如何模拟它?