如何从 Scala 对象使用 SBT IntegrationTest 配置

Mic*_*ler 5 integration-testing scala sbt

为了使我们的多项目构建更易于管理,我们将 Build.scala 文件拆分为几个文件,例如 Dependencies.scala 包含所有依赖项:

import sbt._

object Dependencies {
  val slf4j_api = "org.slf4j" % "slf4j-api" % "1.7.7"
  ...
}
Run Code Online (Sandbox Code Playgroud)

我们想在我们的构建中添加集成测试。根据我们添加的SBT 文档

object Build extends sbt.Build {
  import Dependencies._
  import BuildSettings._
  import Version._
  import MergeStrategies.custom

  lazy val root = Project(
    id = "root",
    base = file("."),
    settings = buildSettings ++ Seq(Git.checkNoLocalChanges, TestReport.testReport)
  ).configs(IntegrationTest).settings(Defaults.itSettings: _*)
  ...
}
Run Code Online (Sandbox Code Playgroud)

其中 Dependencies、BuildSettings、Version 和 MergeStrategies 是在它们自己的文件中定义的自定义 Scala 对象。

按照文档,我们要为 Dependencies.scala 中的 IntegrationTest 配置添加一些依赖项:

import sbt._

object Dependencies {

  val slf4j_api = "org.slf4j" % "slf4j-api" % "1.7.7"

  val junit = "junit" % "junit" % "4.11" % "test,it"
...
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这破坏了构建:

java.lang.IllegalArgumentException:无法将依赖项“junit#junit;4.11”添加到模块的配置“it”中……因为此配置不存在!

我想我需要导入 IntegrationTest 配置。我尝试在 Dependencies.scala 中导入 IntegrationTest 配置:

import sbt.Configurations.IntegrationTest
Run Code Online (Sandbox Code Playgroud)

IntegrationTest 是一个在 Configurations 对象中定义的惰性值:

object Configurations {
  ...
  lazy val IntegrationTest = config("it") extend (Runtime)
  ...
 }
Run Code Online (Sandbox Code Playgroud)

但这并没有解决问题。

有人知道如何解决这个问题吗?

Ric*_*ich 3

Project在将依赖项添加到对象之前,您需要将配置添加到Project对象。

您的代码引用显示您执行了前者,但没有显示您在引用的代码中执行后者的位置。

请您发布完整的配置,或者尝试将这两个配置相互移动?

以下是将配置添加到Project您链接到的 SBT 文档中的对象的位置:

lazy val root = (project in file(".")).
  configs(IntegrationTest).
Run Code Online (Sandbox Code Playgroud)

上面引用的代码声明了一个惰性 val 但不使用它不足以让“it”配置投入使用:

lazy val IntegrationTest = config("it") extend (Runtime)
Run Code Online (Sandbox Code Playgroud)