No se puede ejecutar Scalatest con Gradle
(4)
task scalaTest(dependsOn: testClasses) << {
description = ''Runs Scalatest suite''
ant.taskdef(name: ''scalatest'',
classname: ''org.scalatest.tools.ScalaTestAntTask'',
classpath: sourceSets.test.runtimeClasspath.asPath
)
ant.scalatest(runpath: sourceSets.test.output.classesDir,
haltonfailure: ''true'', fork: ''false'') {
reporter(type: ''stdout'')
}
}
gradle scalaTest
y obtengo:
* What went wrong:
Execution failed for task '':scalaTest''.
> java.lang.NoClassDefFoundError: scala/reflect/ClassManifest$
Estoy usando Scala 2.10.2 y Gradle 1.7
dependencies {
compile ''org.scala-lang:scala-library:2.10.2''
testCompile ''org.scalatest:scalatest:1.3''
testCompile ''org.scalamock:scalamock_2.10:3.0.1''
}
Que pasa ??
A partir de Gradle 3.2.1, la siguiente raíz build.gradle
ejecuta los build.gradle
JUnit y ScalaTest. Este código es para la compilación de varios proyectos, habilitado a través de settings.gradle
, por eso se utilizan los subprojects
.
Además, a propósito utiliza Gradle API explícito, para minimizar la magia DSL de Gradle.
description = ''root project''
def enableScalaTest(Project project) {
Task scalaTest = project.task(
[
''dependsOn'': ''testClasses'',
''description'': ''Runs ScalaTest tests in the project''
],
''scalaTest'',
{
ext.inputDir = project.tasks.getByName(''compileTestScala'').destinationDir
inputs.dir(ext.inputDir)
}
)
scalaTest.doLast({
ant.taskdef(name: ''scalatest'',
classname: ''org.scalatest.tools.ScalaTestAntTask'',
classpath: project.sourceSets.test.runtimeClasspath.asPath)
ant.scalatest(runpath: ext.inputDir,
fork: ''false'',
haltonfailure: ''true'')
{ reporter(type: ''stdout'') }
})
project.getTasks().getByName(''build'').dependsOn(scalaTest)
}
subprojects {
apply plugin: ''scala''
repositories {
mavenCentral()
}
dependencies {
compile ''org.scala-lang:scala-library:2.12.1''
testCompile ''junit:junit:4.12''
testCompile ''org.scalatest:scalatest_2.12:3.0.1''
}
enableScalaTest(delegate)
}
No sé cómo resolver esto, pero puedo ofrecerle una solución. Anota tus clases de prueba con @RunWith(classOf[JUnitRunner])
, así:
import org.scalatest.junit.JUnitRunner
import org.junit.runner.RunWith
@RunWith(classOf[JUnitRunner])
class MyTest extends FunSpec{
}
y luego, la gradle test
debería funcionar.
Editar:
Mis dependencias:
compile "org.scala-lang:scala-library:2.10.1"
testCompile "org.scalatest:scalatest_2.10:1.9.1"
Puedes poner lo siguiente en tu build.gradle
:
task spec(dependsOn: [''testClasses''], type: JavaExec) {
main = ''org.scalatest.tools.Runner''
args = [''-R'', ''build/classes/test'', ''-o'']
classpath = sourceSets.test.runtimeClasspath
}
Luego simplemente ejecuta gradle spec
para ejecutar tus pruebas. Nombré la spec
la tarea porque ya hay una tarea de test
. No sé si puede anular la tarea de prueba predeterminada.
Puedes consultar las opciones disponibles here .
rarry es correcto Y aún mejor, puede anotar una clase de prueba base con @RunWith(classOf[JUnitRunner])
una vez para hacer que todas sus pruebas de ScalaTest se ejecuten con el corredor JUnit (asumiendo que extiendan la clase base), por ejemplo:
import org.junit.runner.RunWith
import org.scalatest._
import org.scalatest.junit.JUnitRunner
@RunWith(classOf[JUnitRunner])
abstract class UnitSpec extends FlatSpec with Matchers