2014-08-29 97 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