Не могу запустить Scalatest с Gradle

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 и получаю:

* What went wrong:
Execution failed for task ':scalaTest'.
> java.lang.NoClassDefFoundError: scala/reflect/ClassManifest$

Я использую Scala 2.10.2 и 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'
}

Что случилось??


person Joshua MN    schedule 16.09.2013    source источник
comment
Похоже, вам не хватает scala-reflect. В любом случае, вероятно, лучше запускать тесты через поддержку Gradle JUnit.   -  person Peter Niederwieser    schedule 16.09.2013


Ответы (5)


Я не знаю, как решить эту проблему, но я могу предложить вам обходной путь. Аннотируйте свои тестовые классы с помощью @RunWith(classOf[JUnitRunner]), например:

import org.scalatest.junit.JUnitRunner
import org.junit.runner.RunWith

@RunWith(classOf[JUnitRunner])
class MyTest extends FunSpec{
}

и тогда gradle test должно работать.

Изменить:

Мои зависимости:

compile "org.scala-lang:scala-library:2.10.1"
testCompile "org.scalatest:scalatest_2.10:1.9.1"
person rarry    schedule 16.09.2013
comment
Поведение другое, но все равно не работает: initializationError java.lang.NoClassDefFoundError: scala/reflect/ClassManifest в index.html отчета - person Joshua MN; 16.09.2013
comment
Я думаю, что самая масштабная зависимость должна быть testCompile вместо compile. - person Eric Pabst; 06.02.2014

Вы можете поместить следующее в свой build.gradle:

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

Примечание. Путь может отличаться в зависимости от версии Gradle, как указано в комментариях @MikeRylander. До Gradle 4 это было «сборка/классы/тест».

Затем просто запустите gradle spec, чтобы выполнить ваши тесты. Я назвал задачу spec, потому что уже есть задача test. Я не знаю, можете ли вы переопределить тестовую задачу по умолчанию.

Вы можете найти доступные варианты здесь.

person Machisuji    schedule 24.11.2014
comment
Вы можете добавить строку test.dependsOn spec для запуска тестов scala с помощью gradle test - person Federico; 14.12.2016
comment
В Gradle 4 вам нужно будет изменить 'build/classes/test' на 'build/classes/scala/test'. - person Mike Rylander; 18.07.2017
comment
@MikeRylander Этот комментарий должен был быть в отдельной ветке как принятый ответ. Спасибо большое. - person yantaq; 21.01.2020
comment
это работает с аргументами фильтра теста gradle? например $ ./gradlew common:test --tests * - person tribbloid; 27.05.2020

Этот ответ может немного запоздать. Но для одного, использующего scala с gradle (5.x), работает следующее.

Добавьте следующий плагин в gradle.

plugins {
  id "com.github.maiflai.scalatest" version "0.25"
}

Чтобы запустить код

> gradle test

В качестве бонуса результаты теста из приведенного выше plugin также будут представлены лучше, чем отчет по умолчанию.

person Developer    schedule 27.06.2019
comment
Мне также пришлось добавить эту зависимость: testRuntime 'org.pegdown:pegdown:1.4.2' - person DeegC; 22.09.2019
comment
Любая ссылка, где это решение используется? С gradle 5.0 я получаю следующую ошибку. Нет подписи метода: static org.gradle.process.internal.DefaultExecActionFactory.root() применим для типов аргументов: () значения: [] Возможные решения: wait(), stop() , ожидание (длинное), печать (java.lang.Object), печать (java.io.PrintWriter), ожидание (длинное, целое) - person dexter2305; 05.04.2020
comment
Этот ответ помог мне, спасибо! Просто предупреждение - убедитесь, что плагин применяется (без .apply(false)). Другими словами, определение НЕ должно выглядеть так, как показано ниже: id("com.github.maiflai.scalatest").version("0.25").apply(false) - person Vlad.Bachurin; 26.02.2021

рари правильно. И, что еще лучше, вы можете аннотировать базовый тестовый класс с помощью @RunWith(classOf[JUnitRunner]) once, чтобы все ваши тесты ScalaTest выполнялись с исполнителем JUnit (при условии, что они расширяют базовый класс), например.:

import org.junit.runner.RunWith
import org.scalatest._
import org.scalatest.junit.JUnitRunner

@RunWith(classOf[JUnitRunner])
abstract class UnitSpec extends FlatSpec with Matchers
person voxoid    schedule 08.03.2016

Начиная с Gradle 3.2.1, после root build.gradle выполняется код JUnit и ScalaTest. Этот код предназначен для многопроектной сборки, включенной через settings.gradle, поэтому используется subprojects.
Кроме того, он намеренно использует явный Gradle API, чтобы свести к минимуму магию Gradle DSL.

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)
}
person Victor Sorokin    schedule 12.12.2016