Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I run both ScalaTest and JUnit tests with Gradle?

I've got a mixed Java / Scala project with both JUnit and ScalaTest tests. With the scalatest plugin, Gradle runs the ScalaTest tests in src/test/scala, but ignores the JUnit tests in src/test/java. Without the plugin, Gradle runs the JUnit tests but ignores the Scala. What trick am I missing?

My build.gradle:

plugins {
  id 'java'
  id 'maven'
  id 'scala'
  id "com.github.maiflai.scalatest" version "0.6-5-g9065d91"
}

sourceCompatibility = 1.8

group = 'org.chrononaut'
version = '1.0-SNAPSHOT'

task wrapper(type: Wrapper) {
    gradleVersion = '2.3'
}

ext {
    scalaMajorVersion = '2.11'
    scalaVersion = "${scalaMajorVersion}.5"
}

repositories {
    mavenCentral()
    mavenLocal()
}

dependencies {
    compile "org.scala-lang:scala-library:${scalaVersion}"
    compile "org.scala-lang.modules:scala-xml_${scalaMajorVersion}:1.0.3"
    compile 'com.google.guava:guava:18.0'
    compile 'javax.xml.bind:jaxb-api:2.2.12'
    compile 'jaxen:jaxen:1.1.6'
    compile 'joda-time:joda-time:2.7'
    compile 'org.joda:joda-convert:1.7'
    compile 'org.apache.commons:commons-lang3:3.3.2'
    compile 'org.jdom:jdom2:2.0.5'

    testCompile 'junit:junit:4.12'
    testCompile 'org.easytesting:fest-assert:1.4'
    testCompile 'org.mockito:mockito-core:1.10.19'
    testCompile "org.scalatest:scalatest_${scalaMajorVersion}:2.2.4"
    testRuntime 'org.pegdown:pegdown:1.1.0' // required by scalatest plugin
}

compileScala {
    scalaCompileOptions.additionalParameters = [
            "-feature",
            "-language:reflectiveCalls", // used for config structural typing
            "-language:postfixOps"
    ]
}

ETA: I know it's possible to annotate Scala tests to force them to run with the JUnit test runner. I'm looking for a one-stop build.gradle solution that doesn't require editing every test file (or messing with the tests to get around limitations in the build system, in general).

like image 984
David Moles Avatar asked Feb 18 '15 19:02

David Moles


People also ask

Which command lets you generate the unit tests of a project developed with Gradle?

We can run our unit tests by using the command: gradle clean test.


3 Answers

Another alternative to running with JUnit (and to creating an Ant task as suggested in comments) - is creating a task that runs ScalaTest's Runner directly:

task scalaTest(dependsOn: ['testClasses'], type: JavaExec) {
  main = 'org.scalatest.tools.Runner'
  args = ['-R', 'build/classes/test', '-o']
  classpath = sourceSets.test.runtimeClasspath
}

test.dependsOn scalaTest // so that running "test" would run this first, then the JUnit tests
like image 180
Tzach Zohar Avatar answered Oct 21 '22 09:10

Tzach Zohar


  1. Get rid of the plugin, as it makes test task to run ScalaTest only (so JUnit gets ignored).
  2. Annotate your ScalaTests with @RunWith(classOf[JUnitRunner])so they can be run by gradle as JUnit tests.
like image 25
Piohen Avatar answered Oct 21 '22 08:10

Piohen


With the latest version of scala-test plugin you can choose whether the existing (junit)-test task is replaced or not by the scala-tests-task. In your case you could use the following in

gradle.properties:

com.github.maiflai.gradle-scalatest.mode = append

Now you can execute both tests:

  • junit: gradle test
  • scala-test: gradle scalatest

or combine them into one task

task allTests {
    dependsOn test
    dependsOn scalatest
}

That worked for me.

like image 4
Tobias Michelchen Avatar answered Oct 21 '22 10:10

Tobias Michelchen