【问题标题】:Can't run Scalatest with Gradle无法使用 Gradle 运行 Scalatest
【发布时间】:2013-09-20 08:34:28
【问题描述】:
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'
}

怎么了??

【问题讨论】:

  • 您好像缺少scala-reflect。无论如何,最好通过 Gradle 的 JUnit 支持运行测试。

标签: scala gradle scalatest


【解决方案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"

【讨论】:

  • 行为不同,但仍然不起作用:报告的 index.html 中的 initializationError java.lang.NoClassDefFoundError: scala/reflect/ClassManifest
  • 我认为scalatest依赖应该是testCompile而不是compile。
【解决方案2】:

您可以将以下内容放入您的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 在 cmets 中指出的 gradle 版本。在 gradle 4 之前,它曾经是 'build/classes/test'。

然后只需运行gradle spec 即可执行您的测试。 我将任务命名为spec,因为已经有一个test 任务。不知道能不能覆盖默认的测试任务。

您可以查找可用的选项here

【讨论】:

  • 您可以添加行 test.dependsOn spec 以使用 gradle test 运行 scala 测试
  • 在 Gradle 4 中,您需要将 'build/classes/test' 更改为 'build/classes/scala/test'
  • @MikeRylander 此评论应该在单独的线程中作为已接受的答案。非常感谢。
  • 这是否适用于 gradle 测试过滤器参数?例如$ ./gradlew common:test --tests "*"
【解决方案3】:

这个回复可能有点晚了。但是对于使用 gradle (5.x) 的 scala 的人来说,以下是有效的。

将以下插件添加到gradle。

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

运行代码

> gradle test

作为奖励,上述plugin 的测试结果也将比默认报告更好地报告。

【讨论】:

  • 我还必须添加这个依赖:testRuntime 'org.pegdown:pegdown:1.4.2'
  • 使用此解决方案的任何参考?使用 gradle 5.0,我收到以下错误“没有方法签名:静态 org.gradle.process.internal.DefaultExecActionFactory.root() 适用于参数类型:() 值:[] 可能的解决方案:wait()、stop( ), 等待(long), 打印(java.lang.Object), 打印(java.io.PrintWriter), 等待(long, int)"
  • 这个回答对我有帮助,谢谢!提醒一下 - 确保应用了插件(没有 .apply(false))。换句话说,定义不应如下所示:id("com.github.maiflai.scalatest").version("0.25").apply(false)
【解决方案4】:

rary 是正确的。甚至更好的是,您可以使用 @RunWith(classOf[JUnitRunner]) once 注释 base test class 以使您的所有 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

【讨论】:

    【解决方案5】:

    从 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)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-03
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多