Grape

2011-08-29 27 views
11

'da sınıf yolu siparişi nasıl belirtilir? TestRuntime yapılandırmasında kavanozların sıralamasını kontrol etmem gerekiyor.Grape

robolectric-x.x.jar'ın android.jar'dan önce geldiğinden emin olmalıyım, yoksa korkunç RuntimeException ("Stub!") Alıyorum.

Bunu nasıl yaparım?

+0

o robolectric kavanoz android önce gelmek zorunda belgelerinde yazıyor mu . sınıf yolunda? –

+1

Evet öyle. Robolectric Ana sayfadan: "Sorun Giderme java.lang.RuntimeException: Koçan robolectric emin olun ve bağımlılıkları sınıf yolunda Android API kavanoz önce görünür." –

+0

Bu, Eclipse'de çalışır, çünkü sınıf yolunun siparişi burada açıkça kontrol edilebilir. Eclipse projesi Gradle tarafından oluşturuldu. –

cevap

10

RoboGuice kullanan Android uygulamam, karşı Robolectric testleri çalıştırmak için benim tam build.gradle geçerli:

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'] 
} 

Bir dışlama eklemek zorunda Test koşucusu için, ya da Gradle bir istisna atar.

MyRobolectricTestRunner.java şuna benzer:

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); 
    } 

} 

Ve burada enjeksiyon gösteren bir örnek testi var:

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

Nasıl başvuruyorsunuz: app? kendi settings.gradle üzerinden? : Uygulama ayrıca tüketecek testler için kendi bağımlılıklarını ortaya koyuyor mu? – Moritz

+0

github'da basit bir örnek alabilir miyiz? – Gary

4

Bu işe yarayabilecek:

İşte
configurations { robo } 

dependencies { 
    robo ... 
    testRuntime ... 
} 

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

CompileClasspath'e de robo eklemek zorunda kaldım –

+0

@Peter [Bu durumda sınıf yollarının sırasını nasıl değiştireceğimizi] biliyor musunuz? (http://stackoverflow.com/questions/22863845/nasıl yapılandırılır-sipariş-of-the-classpath-for-android-studio için) ... – JJD

İlgili konular