NoClassDefFoundError在带有scoverage插件的SBT中运行测试

时间:2015-05-15 14:30:57

标签: scala sbt scoverage

我有一个结构如此的SBT项目:https://orrsella.com/2014/09/24/integration-and-end-to-end-test-configurations-in-sbt-for-scala-java-projects/。它包括标准的测试目录,另外还有 e2e 。还有一项任务" test-all" ,可以运行所有测试。除非我使用覆盖插件运行e2e或test-all,否则一切正常。我得到:java.lang.NoClassDefFoundError:scoverage / Invoker $

使用显示:dependencyClasspath 显示e2e:dependencyClasspath ,我可以看到 e2e 类路径缺少scoverage插件jar。知道什么是错的以及如何解决它?

Build.sbt

import org.scalatra.sbt._
import sbt.Keys._
import sbt._

object MaAppBuild extends Build {
  val Organization = "com.my-org"
  val Name = "My App"
  val Version = "0.1.0-SNAPSHOT"
  val ScalaVersion = "2.11.6"
  val AkkaVersion = "2.3.4"

  val ScalatraVersion = "2.3.0"
  lazy val project = Project(
    "My-App",
    file("."),
    configurations = Configurations.default ++ Testing.configs,
    settings = Defaults.coreDefaultSettings ++ ScalatraPlugin.scalatraSettings ++ Testing.settings ++ Seq(
      organization := Organization,
      name := Name,
      version := Version,
      scalaVersion := ScalaVersion,
      resolvers += "Sonatype OSS Snapshots" at "http://oss.sonatype.org/content/repositories/snapshots/",
      resolvers += "Akka Repo" at "http://repo.akka.io/repository",
      libraryDependencies ++= Seq(
        "com.typesafe.akka" %% "akka-actor" % AkkaVersion,
        "com.typesafe.akka" % "akka-testkit_2.11" % AkkaVersion % "test;it;e2e",
        "net.databinder.dispatch" %% "dispatch-core" % "0.11.1",
        "org.scalatra" %% "scalatra" % ScalatraVersion,
        "com.typesafe.akka" %% "akka-testkit" % AkkaVersion % "test;it;e2e",
        "org.scalatra" %% "scalatra-scalatest" % ScalatraVersion % "test;it;e2e",
        "com.github.tomakehurst" % "wiremock" % "1.55" % "test;it;e2e",
        "ch.qos.logback" % "logback-classic" % "1.0.6" % "runtime",
        "org.scalatra" %% "scalatra-json" % "2.4.0.RC1",
        "org.json4s" %% "json4s-jackson" % "3.2.11",
        "com.typesafe" % "config" % "1.2.1",
        "org.json4s" %% "json4s-native" % "3.2.11",
        "org.eclipse.jetty" % "jetty-webapp" % "8.1.8.v20121106" % "container",
        "org.eclipse.jetty.orbit" % "javax.servlet" % "3.0.0.v201112011016" % "container;provided;test" artifacts Artifact("javax.servlet", "jar", "jar")
      )
    )
  )
}

集成和e2e测试配置:

import sbt.Keys._
import sbt._

object Testing {
  val IntegrationTest = config("it").extend(Runtime)

  val EndToEndTest = config("e2e").extend(Runtime)

  val configs = Seq(IntegrationTest, EndToEndTest)

  lazy val testAll = TaskKey[Unit]("test-all")

  private lazy val itSettings =
    inConfig(IntegrationTest)(Defaults.testSettings) ++
      Seq(
        fork in IntegrationTest := false,
        parallelExecution in IntegrationTest := false,
        scalaSource in IntegrationTest := baseDirectory.value / "src/it/scala",
        resourceDirectory in IntegrationTest := baseDirectory.value / "src/test/resources")

  private lazy val e2eSettings =
    inConfig(EndToEndTest)(Defaults.testSettings) ++
      Seq(
        fork in EndToEndTest := false,
        parallelExecution in EndToEndTest := false,
        scalaSource in EndToEndTest := baseDirectory.value / "src/e2e/scala",
        resourceDirectory in EndToEndTest := baseDirectory.value / "src/test/resources")


  lazy val settings = e2eSettings ++ itSettings ++ Seq(
    testAll <<= (test in EndToEndTest) dependsOn (test in IntegrationTest) dependsOn(test in Test)
  )
}

java.lang.NoClassDefFoundError:scoverage / Invoker $

addSbtPlugin("com.mojolly.scalate" % "xsbt-scalate-generator" % "0.5.0")

addSbtPlugin("org.scalatra.sbt" % "scalatra-sbt" % "0.3.5")

addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.1.0")

1 个答案:

答案 0 :(得分:2)

您似乎需要为sbt项目添加设置:

适合我,"org.scoverage" % "sbt-scoverage" % "1.5.0"

coverageEnabled in Test := true

我发现版本<1.4.0还有另一个解决方案:

coverageEnabled.in(ThisBuild ,Test, test) := true
相关问题