2014-08-29 116 views
1

我想设置Junit测试来测试我的Java代码在一个Android项目。我似乎无法让它与Gradle构建一起工作。单元测试与JUnit Android与Gradle

我现在已经设置了一个测试作为示例。我的项目是我使用Gradle移植的遗产,所以我定义了源集和结构,而不是将文件移动到新的目录格式。

当我运行构建或只是UnitTest的输出是构建成功,但它并没有真正运行我的测试单元测试。 Android工作室似乎并没有将文件识别为java,也没有在我的ExampleTest.java文件中显示错误/代码完成。

Project 
    -> Module 
    -> assets 
    -> build 
    -> gen 
    -> libs 
    -> res 
    -> src 
    -> tests 

我gradle这个build文件:

buildscript { 
    repositories { 
     mavenCentral() 
     maven { url 'http://repo1.maven.org/maven2' } 
     maven { url 'http://download.crashlytics.com/maven' } 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:+' 
     classpath 'com.crashlytics.tools.gradle:crashlytics-gradle:1.+' 
    } 
} 

apply plugin: 'android' 
apply plugin: 'crashlytics' 

repositories { 
    mavenCentral() 
} 

android { 
    compileSdkVersion 20 
    buildToolsVersion '20.0.0' 


    defaultConfig { 
     minSdkVersion 10 
     targetSdkVersion 20 
     versionCode 47 
     versionName '2.1' 

    } 
    buildTypes { 
     release { 
      runProguard true 
      zipAlign true 
      proguardFile getDefaultProguardFile('proguard-android-optimize.txt') 
      proguardFile 'proguard-project.txt' 
     } 
     debug { 
      runProguard false 
     } 
    } 

    productFlavors { 
     defaultFlavor { 
      proguardFile 'proguard-project.txt' 
     } 
    } 

    signingConfigs { 
     debug { 
      storeFile file('../debug.keystore') 
     } 

     release { 
      storeFile file("XX") 
      storePassword "XX" 
      keyAlias "XX" 
      keyPassword "XX" 
     } 
    } 

    sourceSets { 

     main { 
      manifest.srcFile 'AndroidManifest.xml' 
      java.srcDirs = ['src'] 
      resources.srcDirs = ['src'] 
      renderscript.srcDirs = ['src'] 
      res.srcDirs = ['res'] 
      assets.srcDirs = ['assets'] 

     } 

     unitTest { 
      java.srcDir file('tests') 
      resources.srcDir file('test/resources') 
     } 

    } 
} 


sourceSets { 
    unitTest { 
     java.srcDir file('test') 
     resources.srcDir file('test/resources') 
    } 
} 

dependencies { 
    compile 'com.viewpagerindicator:library:[email protected]' 
    compile 'com.crashlytics.android:crashlytics:1.+' 
    unitTestCompile 'junit:junit:4.1+' 
    unitTestCompile files("$buildDir/intermediates/classes/debug") 
} 


configurations { 
    unitTestCompile.extendsFrom runtime 
    unitTestRuntime.extendsFrom unitTestCompile 
} 

task unitTest(type:Test, dependsOn: assemble) { 
    description = "run unit tests" 
    testClassesDir = project.sourceSets.unitTest.output.classesDir 
    classpath = project.sourceSets.unitTest.runtimeClasspath 
} 


// bind to check 
build.dependsOn unitTest 
+0

您尝试过robospock吗? – Opal 2014-08-30 10:02:26

+0

我真的很想用Java编写我的单元测试 – serenskye 2014-09-01 08:47:05

+0

您的build.gradle文件中有几个地方可以进行“测试”。它应该是“测试”,而不是? – 2014-09-01 09:01:52

回答

1

执行以下操作以您的gradle这个脚本。这将允许您在JVM中运行测试,这意味着无需运行模拟器或在设备上运行测试。

在顶部:

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'org.robolectric:robolectric-gradle-plugin:0.12.+' 
    } 
} 

新插件:

apply plugin: 'robolectric' 

而且靠近底部:

robolectric { 

    //configure the set of classes for JUnit tests 
    include '**/*Test.class' 

    //configure whether failing tests should fail the build 
    ignoreFailures false 

} 

,并添加以下的依赖:

androidTestCompile ('junit:junit:4.11') 
androidTestCompile ('org.robolectric:robolectric:2.3') { 
    exclude module: 'classworlds' 
    exclude module: 'maven-artifact' 
    exclude module: 'maven-artifact-manager' 
    exclude module: 'maven-error-diagnostics' 
    exclude module: 'maven-model' 
    exclude module: 'maven-plugin-registry' 
    exclude module: 'maven-profile' 
    exclude module: 'maven-project' 
    exclude module: 'maven-settings' 
    exclude module: 'nekohtml' 
    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-http-shared' 
    exclude module: 'wagon-provider-api' 
    exclude group: 'com.android.support', module: 'support-v4' 
} 

然后开始在测试文件夹中编写测试。正如你所看到的,我设置了一个过滤器,所以只有以Test.class开头的类才包含在测试套件中。务必把下面的注解这些测试类:(一定要改变的URL清单文件,因为这将是自写的是什么你不同)

@RunWith(RobolectricTestRunner.class) 
@Config(manifest = "./src/main/AndroidManifest.xml", emulateSdk = 18) 
class FirstTest { 
    // tests go here 
} 

最后,运行与测试./gradlew test

+0

Robolectric从3.0开始不使用gradle插件,您能否提供更新? – 2015-12-18 09:53:26