web-dev-qa-db-ja.com

GradleでScalatestを実行できません

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とGradle1.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'
}

どうしましたか??

24
Joshua MN

これを解決する方法はわかりませんが、回避策を提供できます。次のように、テストクラスに@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"
31
rarry

build.gradleに次のものを入れることができます。

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

注:@ MikeRylanderのコメントで指摘されているように、パスはgradleのバージョンによって異なる場合があります。 Gradle 4より前は、「build/classes/test」でした。

次に、gradle specを実行してテストを実行します。すでにspecタスクがあるため、タスクにtestという名前を付けました。デフォルトのテストタスクを上書きできるかどうかはわかりません。

利用可能なオプションを調べることができます ここ

20
Machisuji

Gradle 3.2.1以降、ルートbuild.gradleをたどると、JUnitコードとScalaTestコードの両方が実行されます。このコードはマルチプロジェクトビルド用であり、settings.gradleを介して有効になっているため、subprojectsが使用されています。
さらに、Gradle DSLの魔法を最小限に抑えるために、意図的に明示的なGradleAPIを使用しています。

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)
}
3
Victor Sorokin

この応答は少し遅れる可能性があります。しかし、gradle(5.x)でscalaを使用している場合、次のように機能します。

次のプラグインをgradleに追加します。

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

コードを実行するには

> gradle test

ボーナスとして、上記のpluginのテスト結果も、デフォルトのレポートよりも適切にレポートされます。

3
Developer

ラリーは正しいです。さらに良いことに、基本テストクラス@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
3
voxoid