android - महत - संसाधन की परिभाषा




Gradle के साथ Robolectric: संसाधन नहीं मिला (2)

मैं इस मुद्दे पर दौड़ रहा था और यही वह है जिसके साथ मैं आया था। परीक्षणों के लिए एक अलग परियोजना बनाने के बजाय, मैंने रोबोलेक्ट्रिक परीक्षणों के लिए एक स्रोत सेट बनाया और एक नया कार्य जोड़ा जो "चेक" पर निर्भर करेगा। अपने प्रश्न से कुछ कोड का उपयोग करके, यहां (काम कर रहे) फ़ाइल के प्रासंगिक बिट्स हैं:

apply plugin: 'android'

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

dependencies {
    compile 'org.roboguice:roboguice:2.0'
    compile 'com.google.android:support-v4:r6'

    testLocalCompile 'junit:junit:4.8.2'
    testLocalCompile 'org.robolectric:robolectric:2.1'
    testLocalCompile 'com.google.android:android:4.0.1.2'
    testLocalCompile 'com.google.android:support-v4:r6'
    testLocalCompile 'org.roboguice:roboguice:2.0'
}

task localTest(type: Test, dependsOn: assemble) {
    testClassesDir = sourceSets.testLocal.output.classesDir

    android.sourceSets.main.java.srcDirs.each { dir ->
        def buildDir = dir.getAbsolutePath().split('/')
        buildDir =  (buildDir[0..(buildDir.length - 4)] + ['build', 'classes', 'debug']).join('/')

        sourceSets.testLocal.compileClasspath += files(buildDir)
        sourceSets.testLocal.runtimeClasspath += files(buildDir)
    }

    classpath = sourceSets.testLocal.runtimeClasspath
}

check.dependsOn localTest

मैंने अपनी निर्भरता ब्लॉक को इंगित करने के लिए शामिल किया है कि मुझे यह प्राप्त करने और जाने के लिए, मुझे अपने कस्टम testLocal स्रोत सेट में मेरी सभी compile निर्भरताओं को दोहराना पड़ा।

रनिंग gradle testLocal बनाता है और केवल src/test/java अंदर परीक्षण चलाता है, जबकि gradle check चलाने के दौरान इन परीक्षणों को डिफ़ॉल्ट एंड्रॉइड उपकरण में स्रोत स्रोत सेट के अतिरिक्त चलाता है।

उम्मीद है की यह मदद करेगा!

मैं अपने रोबलेक्ट्रिक परीक्षणों को नए ग्रैडल एंड्रॉइड बिल्ड सिस्टम के साथ चलाने की कोशिश कर रहा हूं, लेकिन मैं अपने मुख्य प्रोजेक्ट के संसाधनों तक पहुंचने में फंस गया हूं।

java और android ग्रेडल प्लगइन्स के बीच संघर्ष से बचने के लिए मैंने बिल्ड को दो अलग-अलग परियोजनाओं में विभाजित किया, इसलिए निर्देशिका संरचना लगभग इस तरह दिखती है:

.
├── build.gradle
├── settings.gradle
├── mainproject
│   ├── build
│   │   ├── classes
│   │   │   └── debug
│   ├── build.gradle
│   └── src
│       └── main
│           ├── AndroidManifest.xml
│           └── ...
└── test
    ├── build.gradle
    └── src
        └── test
            └── java
                └── ...
                    └── test
                        ├── MainActivityTest.java
                        ├── Runner.java
                        ├── ServerTestCase.java
                        └── StatusFetcherTest.java

test/ में मेरा build.gradle test/ वर्तमान में इस तरह दिखता है:

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.stanfy.android:gradle-plugin-java-robolectric:2.0'
    }
}

apply plugin: 'java-robolectric'

repositories {...}

javarob {
    packageName = 'com.example.mainproject'
}

test {
    dependsOn ':mainproject:build'
    scanForTestClasses = false
    include "**/*Test.class"
    // Oh, the humanity!
    def srcDir = project(':mainproject').android.sourceSets.main.java.srcDirs.toArray()[0].getAbsolutePath()
    workingDir srcDir.substring(0, srcDir.lastIndexOf('/'))
}

project(':mainproject').android.sourceSets.main.java.srcDirs.each {dir ->
    def buildDir = dir.getAbsolutePath().split('/')
    buildDir =  (buildDir[0..(buildDir.length - 4)] + ['build', 'classes', 'debug']).join('/')

    sourceSets.test.compileClasspath += files(buildDir)
    sourceSets.test.runtimeClasspath += files(buildDir)
}

dependencies {    
    testCompile group: 'com.google.android', name: 'android', version: '4.1.1.4'
    testCompile group: 'org.robolectric', name: 'robolectric', version: '2.0-alpha-3'
    ...
}

बुरा वर्गपाथ हैकरी मुझे R को छोड़कर, मेरे मुख्य प्रोजेक्ट के सभी वर्गों तक पहुंचने की अनुमति देता है, जो बिल्ड निर्देशिका में .class फ़ाइल के रूप में मौजूद है, लेकिन compileTestJava दौरान यह त्रुटि उठाता है:

/.../MainActivityTest.java:16: error: cannot find symbol
                final String appName = activity.getResources().getString(R.string.app_name);
                                                                          ^
  symbol:   variable string
  location: class R
1 error
:test:compileTestJava FAILED

नए निर्माण प्रणाली के साथ रोबोलेक्ट्रिक परीक्षण निष्पादित करने का एक बेहतर तरीका होना चाहिए, है ना?

( ऐप का पूरा स्रोत )


अपडेट करें: जेक व्हार्टन ने अभी gradle-android-test-plugin की घोषणा की है। आप इसे gradle-android-test-plugin पर पा सकते हैं

यह सुंदर सुव्यवस्थित प्रतीत होता है, खासकर यदि आप robolectric का उपयोग करने की योजना बना रहे हैं।

नीचे पुराना उत्तर

robolectric-plugin आशाजनक लग रहा है।

नमूना build.gradle फ़ाइल वे प्रदान करते हैं:

buildscript {
    repositories {
        mavenCentral()
        maven {
            url "https://oss.sonatype.org/content/repositories/snapshots"
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.4.2'
        classpath 'com.novoda.gradle:robolectric-plugin:0.0.1-SNAPSHOT'
    }
}

apply plugin: 'android'
apply plugin: 'robolectric'

repositories {
    mavenCentral()
    mavenLocal()
    maven {
        url "https://oss.sonatype.org/content/repositories/snapshots"
    }
}

dependencies {
    //compile files('libs/android-support-v4.jar')

    // had to deploy to sonatype to get AAR to work
    compile 'com.novoda:actionbarsherlock:4.3.2-SNAPSHOT'

    robolectricCompile 'org.robolectric:robolectric:2.0'
    robolectricCompile group: 'junit', name: 'junit', version: '4.+'
}

android {
    compileSdkVersion 17
    buildToolsVersion "17.0.0"

    defaultConfig {
        minSdkVersion 7
        targetSdkVersion 17
    }
}

यह एंड्रॉइड ग्रैडल प्लगइन संस्करण 0.5 के साथ काम नहीं कर रहा है लेकिन शायद यह जल्द ही होगा।







robolectric