在 main 和 test 中复制包对象

rog*_*one 5 scala sbt

我在主代码树和测试代码树中都定义了一个包对象,如下所示。当我执行sbt run主代码树中的程序时生效。而当我运行测试用例 ( sbt test) 时,测试代码树中定义的包对象生效。例如

src/main/scala/com/example/package.scala

package object core {
  val foo = "Hello World"
}
Run Code Online (Sandbox Code Playgroud)

src/test/scala/com/example/package.scala

package object core {
val foo = "Goodbye World"
}
Run Code Online (Sandbox Code Playgroud)

sbt run的值com.example.core.fooHello World。上sbt test的价值com.example.core.foo再见世界

这只是 SBT 的一个怪癖还是一个定义明确的 scala/sbt 特性?。我目前通过在相应的包对象中定义用于生产和测试的模块绑定来将此行为用于依赖项注入。这是一种可取的方法吗?

yǝs*_*ǝla 2

Scala 在当前路径中查找包对象,因此这是一个定义良好的行为。由于您的代码位于test不同main的地方,因此它会找到不同的val foos。

使用此机制的方式与使用隐式非常相似。对于隐式和隐式解决方案的一般建议是不要滥用它。我认为在这种情况下,这不是提供依赖关系的最佳方式。

您始终必须考虑您所处的范围 - 如果您使用范围内定义的类,maintest如何使用foofrom main,以及如何使用foofrom test- 每当您需要其中之一时。您必须已经考虑它将如何工作并考虑各种场景。如果您的测试类位于不同的包中,您会得到什么foo,这是否取决于您的测试类的声明位置?

让依赖注入更加明确,不要花太多心思在上面,或者有机会让别人感到困惑。