2011-02-28 11 views
61

Tengo dos proyectos, proyecto A y proyecto B. Ambos están escritos en groovy y usan gradle como su sistema de compilación.Dependencia de prueba de Gradle

El proyecto A requiere el proyecto B. Esto se aplica tanto al código de compilación como al código de prueba.

¿Cómo puedo configurar que las clases de prueba del proyecto A tengan acceso a las clases de prueba del proyecto B?

+2

posible duplicado: http://stackoverflow.com/questions/5644011/multi-project-test-dependencies-with-gradle –

Respuesta

87

Puede exponer las clases de prueba a través de una configuración de 'pruebas' y luego definir una dependencia testCompile en esa configuración.

que tienen este bloque para todos los proyectos de Java, que sacude todo el código de prueba:

task testJar(type: Jar, dependsOn: testClasses) { 
    baseName = "test-${project.archivesBaseName}" 
    from sourceSets.test.output 
} 

configurations { 
    tests 
} 

artifacts { 
    tests testJar 
} 

Entonces cuando tengo código de prueba que desee acceder entre los proyectos que utilizo

dependencies { 
    testCompile project(path: ':aProject', configuration: 'tests') 
} 

Esto es para Java; Asumo que debería funcionar también para Groovy.

+0

¿no hay otra manera de hacer esto, excepto las clases de prueba de compilación? – djangofan

+1

Si entiendo tu pregunta, entonces sí, por lo que sé, necesitarás compilar las clases de prueba para usarlas como dependencias. –

+1

para versiones posteriores de Gradle (estoy usando 1.3) la línea "from sourceSets.test.classes" debe leer "from sourceSets.test.output" – Ben

5

La solución anterior funciona, pero no para la última versión 1.0-rc3 de Gradle.

 task testJar(type: Jar, dependsOn: testClasses) { 
     baseName = "test-${project.archivesBaseName}" 

     // in the latest version of Gradle 1.0-rc3 
     // sourceSets.test.classes no longer works 
     // It has been replaced with 
     // sourceSets.test.output 

     from sourceSets.test.output 
    } 
8

Esto funciona para mí (Java)

// use test classes from spring-common as dependency to tests of current module 
testCompile files(this.project(':spring-common').sourceSets.test.output) 
testCompile files(this.project(':spring-common').sourceSets.test.runtimeClasspath) 

// filter dublicated dependency for IDEA export 
def isClassesDependency(module) { 
    (module instanceof org.gradle.plugins.ide.idea.model.ModuleLibrary) && module.classes.iterator()[0].url.toString().contains(rootProject.name) 
} 

idea { 
     module { 
      iml.whenMerged { module -> 
       module.dependencies.removeAll(module.dependencies.grep{isClassesDependency(it)}) 
       module.dependencies*.exported = true 
      } 
     } 
    } 
..... 
// and somewhere to include test classes 
testRuntime project(":spring-common") 
0

Para Gradle 1.5

task testJar(type: Jar, dependsOn: testClasses) { 
    from sourceSets.test.java 
    classifier "tests" 
} 
11

Ésta es una solución más simple que no requiere un archivo jar intermedia:

dependencies { 
    ... 
    testCompile project(':aProject').sourceSets.test.output 
} 

There ' s más discusión en esta pregunta: Multi-project test dependencies with gradle

+3

Esto rompe la integración IDE y pierde dependencias transitivas. También rompe la encapsulación de proyectos, lo cual es siempre una mala práctica. –

1

Para Android en la última versión de gradle (actualmente estoy en 2.14.1) solo necesita agregar lo siguiente en el Proyecto B para obtener todas las dependencias de prueba del Proyecto A.

dependencies { 
    androidTestComplie project(path: ':ProjectA') 
} 
Cuestiones relacionadas