18
votes

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).

3
What happens if you remove com.github.maiflai.scalatest and what does it fix?judoole
If I remove com.github.maiflai.scalatest then the Scala tests don't get run, only the JUnit ones (see original post).David Moles
Maybe if you slap on this to make ScalaTests run with Gradle: @RunWith(classOf[org.scalatest.junit.JUnitRunner])judoole
Sorry about the bad reading of the original post...judoole

3 Answers

11
votes

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
10
votes
  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.
3
votes

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.