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'
}
どうしましたか??
これを解決する方法はわかりませんが、回避策を提供できます。次のように、テストクラスに@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"
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
という名前を付けました。デフォルトのテストタスクを上書きできるかどうかはわかりません。
利用可能なオプションを調べることができます ここ 。
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)
}
この応答は少し遅れる可能性があります。しかし、gradle(5.x)でscalaを使用している場合、次のように機能します。
次のプラグインをgradleに追加します。
plugins {
id "com.github.maiflai.scalatest" version "0.25"
}
コードを実行するには
> gradle test
ボーナスとして、上記のplugin
のテスト結果も、デフォルトのレポートよりも適切にレポートされます。
ラリーは正しいです。さらに良いことに、基本テストクラスに@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