2011-08-29 22 views
11

में क्लासपाथ ऑर्डरिंग को निर्दिष्ट करने के लिए मुझे testRuntime कॉन्फ़िगरेशन में जार के ऑर्डर को नियंत्रित करने की आवश्यकता है।ग्रैडल

मुझे यह सुनिश्चित करना होगा कि robolectric-x.x.jar android.jar से पहले आता है, या फिर मुझे डरावनी रनटाइम अपवाद ("स्टब!") मिलती है।

मैं यह कैसे कर सकता हूं?

+0

यह प्रलेखन कि robolectric जार एंड्रॉयड से पहले आने के लिए है में कहना है क्लासपाथ पर .jar? –

+1

हां यह करता है। Robolectric मुख्यपृष्ठ से: "समस्या निवारण java.lang.RuntimeException: स्टब कि यकीन है कि robolectric बनाने और उसके निर्भरता classpath में एंड्रॉयड एपीआई जार से पहले दिखाई देते हैं।" –

+0

यह ग्रहण में काम करता है, क्योंकि कोई वहां कक्षा वर्ग के क्रम को स्पष्ट रूप से नियंत्रित कर सकता है। ग्रहण परियोजना ग्रैडल द्वारा उत्पन्न की गई थी। –

उत्तर

10

यहाँ मेरी Android एप्लिकेशन है, जो RoboGuice का उपयोग करता है के खिलाफ Robolectric परीक्षण चलाने के लिए मेरा पूरा build.gradle है:

apply plugin: 'java' 

androidJar = new File(System.getenv('ANDROID_HOME'), '/platforms/android-7/android.jar') 

configurations { robo } 

dependencies { 
    robo('com.pivotallabs:robolectric:1.0-RC1') 
    testCompile('org.roboguice:roboguice:1.1.2') 
    testCompile('junit:junit:4.8.2') 
    testCompile project (':app') 
    testCompile files(androidJar) 
} 

sourceSets.test.compileClasspath = configurations.robo + sourceSets.test.compileClasspath 
sourceSets.test.runtimeClasspath = configurations.robo + sourceSets.test.runtimeClasspath 

test { 
    excludes = ['**/MyRobolectricTestRunner.class'] 
} 

मैं कोई बहिष्करण जोड़ना था परीक्षण धावक के लिए, या फिर ग्रैडल एक अपवाद फेंक देगा।

MyRobolectricTestRunner.java इस तरह दिखता है:

package com.acme.myapp; 

import java.io.File; 
import org.junit.runners.model.InitializationError; 
import roboguice.application.RoboApplication; 
import roboguice.inject.ContextScope; 
import com.google.inject.Injector; 
import com.xtremelabs.robolectric.Robolectric; 
import com.xtremelabs.robolectric.RobolectricTestRunner; 

public class MyRobolectricTestRunner extends RobolectricTestRunner { 
    public MyRobolectricTestRunner(Class<?> testClass) throws InitializationError { 
     // Tell Robolectric where to find AndroidManifest.xml and res/ 
     super(testClass, new File("../app")); 
    } 

    /** 
    * Enable injection into tests as well... 
    */ 
    @Override 
    public void prepareTest(Object test) { 
     RoboApplication myApplication = (RoboApplication) Robolectric.application; 
     Injector injector = myApplication.getInjector(); 
     ContextScope contextScope = injector.getInstance(ContextScope.class); 
     contextScope.enter(myApplication); 
     injector.injectMembers(test); 
    } 

} 

और यहाँ एक नमूना परीक्षण है कि दिखाता है इंजेक्शन है:

package com.acme.myapp; 

import static org.junit.Assert.assertEquals; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import roboguice.inject.InjectResource; 

@RunWith(MyRobolectricTestRunner.class) 
public class StringFormattingTest { 

    @InjectResource(R.string.info_pending_amount) 
    private String pendingAmountPattern; 

    @Test 
    public void testFormatInfoPendingAmount() { 
     String s = String.format(pendingAmountPattern, 20.0d, "EUR"); 
     assertEquals("Only a part of your stake (20,00 EUR) was accepted", s); 
    } 

} 
+0

आप अपने ऐप का संदर्भ कैसे देते हैं? अपनी सेटिंग्स के माध्यम से। gradle? क्या ऐप उपभोग करने के लिए परीक्षणों के लिए अपनी निर्भरता का पर्दाफाश करता है? – Moritz

+0

क्या हमें गिथब पर एक साधारण नमूना मिल सकता है? – Gary

4

यह काम हो सकता है:

configurations { robo } 

dependencies { 
    robo ... 
    testRuntime ... 
} 

sourceSets.test.runtimeClasspath = configurations.robo + sourceSets.test.runtimeClasspath 
+0

मुझे संकलन क्लासपैथ के साथ रोबो को भी जोड़ना था –

+0

@ पीटर क्या आप जानते हैं कि [इस मामले में क्लासपाथ के क्रम को कैसे बदलें] (http://stackoverflow.com/प्रश्न/22863845/एंड्रॉइड-स्टूडियो के लिए-पुस्तकालय-इन-द-क्लासपाथ-टू-एंड्रॉइड-स्टूडियो) ... – JJD

संबंधित मुद्दे