Tengo una configuración multiproyecto y quiero usar gradle.
Mis proyectos son así:
Proyecto a
- ->
src/main/java
- ->
src/test/java
- ->
Proyecto B
- ->
src/main/java
(dependesrc/main/java
del Proyecto A ) - ->
src/test/java
(dependesrc/test/java
del Proyecto A )
- ->
Mi archivo de Proyecto B build.gradle
es así:
apply plugin: 'java'
dependencies {
compile project(':ProjectA')
}
La tarea compileJava
gran trabajo pero el compileTestJava
no se compila el archivo de prueba del Proyecto A .
Respuestas:
En desuso: para Gradle 5.6 y superior, use esta respuesta .
En el Proyecto B , solo necesita agregar una
testCompile
dependencia:Probado con Gradle 1.7.
fuente
gradle testClasses
antes de que la estructura de compilación sea realmente válida. Por ejemplo, el complemento Eclipse no le permitirá importar el proyecto antes de eso. Realmente es una penatestCompile project(':A')
que no funcione. @ DavidPärsson: "Gradle 1.3" contradice "ya no" desde que Fesler probó con Gradle 1.7.La forma simple es agregar una dependencia de tarea explícita en ProjectB:
La forma difícil (pero más clara) es crear una configuración de artefactos adicional para el Proyecto A:
y agregue la
testCompile
dependencia para ProjectBfuente
testArtifacts
configuración como esta:configurations { testArtifacts }
para obtener más detalles, consulte esta sección de la ayuda de Gradle: gradle.org/docs/current/dsl/…from sourceSets.test.output
y posiblementeclassifier = 'tests'
en lugar de// pack whatever you need...
en la respuestaEsto ahora es compatible como una característica de primera clase en Gradle. Los módulos con
java
ojava-library
complementos también pueden incluir unjava-test-fixtures
complemento que expone clases de ayuda y recursos para ser consumidos contestFixtures
ayuda. Los beneficios de este enfoque contra artefactos y clasificadores son:Ejemplo
:modul:one
modul / one / build.gradle
modul / one / src / testFixtures / java / com / example / Helper.java
:modul:other
modul / other / build.gradle
modul / other / src / test / java / com / example / other / SomeTest.java
Otras lecturas
Para obtener más información, consulte la documentación:
https://docs.gradle.org/current/userguide/java_testing.html#sec:java_test_fixtures
Fue agregado en 5.6:
https://docs.gradle.org/5.6/release-notes.html#test-fixtures-for-java-projects
fuente
Me he encontrado con este problema recientemente, y este es un tema difícil para el que encontrar respuestas.
El error que está cometiendo es pensar que un proyecto debería exportar sus elementos de prueba de la misma manera que exporta sus artefactos y dependencias principales.
Lo que tuve mucho más éxito personalmente fue hacer un nuevo proyecto en Gradle. En tu ejemplo, lo nombraría
Proyecto A_Test -> src / main / java
Pondría en src / main / java los archivos que tiene actualmente en Project A / src / test / java. Realice cualquier dependencia de TestCompile de su proyecto A compile las dependencias de Project A_Test.
Luego, haga que el Proyecto A_Test sea una dependencia de TestCompile del Proyecto B.
No es lógico cuando lo consideras desde la perspectiva del autor de ambos proyectos, pero creo que tiene mucho sentido cuando piensas en proyectos como junit y scalatest (y otros. Aunque esos marcos están relacionados con las pruebas, ellos no se consideran parte de los objetivos de "prueba" dentro de sus propios marcos: producen artefactos primarios que otros proyectos simplemente usan dentro de su configuración de prueba. Simplemente desea seguir ese mismo patrón.
Intentar hacer las otras respuestas enumeradas aquí no me funcionó personalmente (usando Gradle 1.9), pero descubrí que el patrón que describo aquí es una solución más limpia de todos modos.
fuente
Sé que es una vieja pregunta, pero tuve el mismo problema y pasé un tiempo averiguando qué está pasando. Estoy usando Gradle 1.9. Todos los cambios deben estar en ProjectB's
build.gradle
Para usar las clases de prueba de ProjectA en pruebas de ProjectB:
Para asegurarse de que la
sourceSets
propiedad esté disponible para ProjectA:Para asegurarse de que las clases de prueba de ProjectA estén realmente allí, cuando compila ProjectB:
fuente
.classesDir
.Nueva solución basada en testJar (dependencias trnsitivas compatibles) disponible como complemento de gradle:
https://github.com/hauner/gradle-plugins/tree/master/jartest
https://plugins.gradle.org/plugin/com.github.hauner.jarTest/1.0
De la documentación
fuente
Could not get unknown property 'testClasses' for project ':core' of type org.gradle.api.Project.
Por favor, lea la actualización a continuación.
Problemas similares descritos por JustACluelessNewbie ocurren en IntelliJ IDEA. El problema es que la dependencia en
testCompile project(':core').sourceSets.test.output
realidad significa: "depende de las clases generadas por la tarea de construcción de gradle". Entonces, si abre un proyecto limpio donde las clases aún no se generan, IDEA no las reconocerá e informará de errores.Para solucionar este problema, debe agregar una dependencia en los archivos de origen de prueba junto a la dependencia en las clases compiladas.
Puede observar las dependencias reconocidas por IDEA en Configuración del módulo -> Dependencias (alcance de la prueba) .
Por cierto. Esta no es una buena solución, por lo que vale la pena considerar la refactorización. Gradle tiene un subproyecto especial que contiene solo clases de soporte de prueba. Ver https://docs.gradle.org/current/userguide/test_kit.html
Actualización 2016-06-05 Más Estoy pensando en la solución propuesta menos Me gusta. Hay pocos problemas con esto:
Entonces, ¿cuál es la mejor solución? En mi opinión, está creando un nuevo conjunto de fuentes personalizado y colocando clases compartidas en él. En realidad, los autores del proyecto Gradle lo hicieron creando el conjunto de fuentes testFixtures.
Para hacerlo solo tienes que:
Declarar dependencia adecuada en proyecto dependiente:
fuente
La solución de Fesler no me funcionó cuando lo intenté para construir un proyecto de Android (gradle 2.2.0). Así que tuve que hacer referencia a las clases requeridas manualmente:
fuente
@VisibleForTesting
reglas de pelusa. No podrá llamar a tales métodos desde el módulo normal en la carpeta no prueba.Llego tan tarde a la fiesta (ahora es Gradle v4.4) pero para cualquiera que encuentre esto:
Asumiendo:
Vaya a build.gradle del proyecto B (el que necesita algunas clases de prueba de A) y agregue lo siguiente:
o (suponiendo que su proyecto se llame "Proyecto B")
Voila!
fuente
Si tiene dependencias simuladas que necesita compartir entre pruebas, puede crear un nuevo proyecto
projectA-mock
y luego agregarlo como dependencia de pruebaProjectA
yProjectB
:Esta es una solución clara para compartir dependencias simuladas, pero si necesita ejecutar pruebas
ProjectA
enProjectB
uso, use otra solución.fuente
Si desea utilizar dependencias de artefactos para tener:
entonces la sección de dependencias de ProjectB en build.gradle debería verse así:
Para que esto funcione, ProjectA necesita construir un tarro de pruebas e incluirlo en los artefactos que produce.
El build.gradle de ProjectA debe contener una configuración como esta:
Cuando los artefactos de ProjectA se publiquen en su artefacto, incluirán un jar de prueba .
El testCompile en la sección de dependencias ProjectB traerá en las clases en el -pruebas frasco.
Si desea incluir las clases de fuente y prueba de Flat ProjectA en ProjectB para fines de desarrollo, la sección de dependencias en build.gradle de ProjectB se vería así:
fuente
println(configurations.joinToString("\n") { it.name + " - " + it.allDependencies.joinToString() })
(en un Kotlin Buildscript), determiné qué configuraciones aún existen y tienen dependencias, pero para todos estos Gradle se quejó:Selected configuration 'testCompileClasspath' on 'project :sdk' but it can't be used as a project dependency because it isn't intended for consumption by other components.
Algunas de las otras respuestas causaron errores de una forma u otra: Gradle no detectó clases de prueba de otros proyectos o el proyecto Eclipse tenía dependencias no válidas cuando se importó. Si alguien tiene el mismo problema, sugiero ir con:
La primera línea obliga al Eclipse a vincular el otro proyecto como dependencia, por lo que todas las fuentes están incluidas y actualizadas. El segundo permite que Gradle vea realmente las fuentes, sin causar ningún error de dependencia no válido como lo
testCompile project(':core').sourceSets.test.output
hace.fuente
Aquí, si está utilizando Kotlin DSL , debe crear su tarea de esa manera según la documentación de Gradle .
Como en algunas respuestas anteriores, debe crear una configuración especial dentro del proyecto que comparta su clase de pruebas, para que no mezcle las clases principales y de prueba.
Pasos simples
build.gradle.kts
:build.gradle.kts
:fuente
en el proyecto B:
Parece funcionar en 1.7-rc-2
fuente