Como migrar Scalatest JUnitRunner a Scala 2.13
Antecedentes
Tengo un proyecto Scala 2.12 con sus test unitarios en ScalaTest y haciendo uso del JUnit runner de ScalaTest para poder ejecutarlos con Gradle.
Al verme en la necesidad de migrar el codigo a Scala 2.13 lo primero que haces despues de adaptar ciertos fragmentos deprecados dentro de tu codigo fuente es ejecutar los test unitarios. Pero … sorpresa! el runner no está incluido en la version de ScalaTest para Scala 2.13.
Buscando soluciones
Para solucionarlo y poder ejecutar los test con Gradle desde la linea de comandos o desde un pipeline de IC
sin quitar la anotación @RunWith(classOf[JUnitRunner])
de la cabecera de las clases de test, me pongo a buscar
en internet posibles soluciones aportadas por la comunidad.
Estas van desde:
- crear tu propia tarea Gradle test
- usar JUnit Jupiter y JUnit Platform
- usar runners de JUnit para Scalatest creados en pequeños proyectos opensource
Pero ninguno me daba lo que quería que básicamente es:
- cuando ejecuto mis test con
gradlew test
obtener el mismo formato y orden de ejecución. Ya que son actores akka y en algunos casos necesito orden de ejecución entre los diferentes test. - Seguir usando JUnit 4 puesto que desde ScalaTest
ya nos indican que la anotación
RunWith
tiene que ejecutarse con JUnit 4. - cambiar lo mínimo el
build.gradle
Después de buscar mucho por internet y no encontrar ninguna alternativa acorde con mis necesidades, encuentro la solución en la documentacion oficial de Scala Test:
http://doc.scalatest.org/3.0.8/org/scalatest/junit/JUnitRunner.html
Solucion
En el enlace proporcionado anteriormente se indica que JUnitRunner
de ScalaTest está deprecado
y que uses org.scalatestplus.junit
. Asi que allá vamos.
Añadir al build.gradle
testCompile "org.scalatestplus:scalatestplus-junit_2.13:1.0.0-M2"
Cambiar ExampleSpec.scala
Antes:
import org.scalatest.junit.JUnitRunner
import org.scalatest.{BeforeAndAfterAll, Matchers, WordSpec}
@RunWith(classOf[JUnitRunner])
class ExampleSpec extends WordSpec with Matchers with BeforeAndAfterAll
Después:
import org.scalatest.BeforeAndAfterAll
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
import org.scalatestplus.junit.JUnitRunner
@RunWith(classOf[JUnitRunner])
class ExampleSpec extends AnyWordSpec with Matchers with BeforeAndAfterAll
WordSpec
está deprecado porAnyWordSpec
El traitMatchers
ahora se encuentra enorg.scalatest.matchers.should.Matchers