2011-08-29 26 views
11

Necesito controlar el orden de los archivos jar en la configuración testRuntime.Cómo especificar el orden de la ruta de clases en Gradle

Debo asegurarme de que robolectric-x.x.jar viene antes de android.jar, o si no me sale la temida RuntimeException ("Stub!").

¿Cómo puedo hacer eso?

+0

¿Dice en la documentación que el frasco robolectric tiene que venir antes androide .jar en el classpath? –

+1

Sí lo hace. Desde la página principal Robolectric: "Solución de problemas java.lang.RuntimeException: Trozo Asegúrese de que robolectric y sus dependencias aparecen antes de los frascos de la API de Android en la ruta de clase." –

+0

Funciona en Eclipse, porque uno puede controlar explícitamente el orden del classpath allí. El proyecto Eclipse fue generado por Gradle. –

Respuesta

10

Aquí es mi completa build.gradle para la ejecución de pruebas Robolectric contra mi aplicación para Android, que utiliza RoboGuice:

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

he tenido que añadir una exclusión para el corredor de prueba, de lo contrario, Gradle lanzará una excepción.

MyRobolectricTestRunner.java se ve así:

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

} 

Y es una prueba de ejemplo que ilustra la inyección aquí:

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

¿Cómo hace referencia a su: aplicación? a través de su propia settings.gradle? ¿La aplicación: también expone sus propias dependencias para que las pruebas consuman? – Moritz

+0

¿podríamos obtener una muestra simple en github? – Gary

4

Esto podría funcionar:

configurations { robo } 

dependencies { 
    robo ... 
    testRuntime ... 
} 

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

Tuve que agregar robo al compileClasspath también –

+0

@ Peter ¿Sabe cómo [cambiar el orden de los classpaths en este caso] (http://stackoverflow.com/questions/22863845/how-to-configure-the-order-of-libraries-in-the-classpath-for-android-studio) ... – JJD

Cuestiones relacionadas