我在主代码树和测试代码树中都定义了一个包对象,如下所示。当我执行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.foo
是Hello World。上sbt test
的价值com.example.core.foo
是再见世界
这只是 SBT 的一个怪癖还是一个定义明确的 scala/sbt 特性?。我目前通过在相应的包对象中定义用于生产和测试的模块绑定来将此行为用于依赖项注入。这是一种可取的方法吗?
Scala 在当前路径中查找包对象,因此这是一个定义良好的行为。由于您的代码位于test
不同main
的地方,因此它会找到不同的val foo
s。
使用此机制的方式与使用隐式非常相似。对于隐式和隐式解决方案的一般建议是不要滥用它。我认为在这种情况下,这不是提供依赖关系的最佳方式。
您始终必须考虑您所处的范围 - 如果您使用范围内定义的类,main
您test
如何使用foo
from main
,以及如何使用foo
from test
- 每当您需要其中之一时。您必须已经考虑它将如何工作并考虑各种场景。如果您的测试类位于不同的包中,您会得到什么foo
,这是否取决于您的测试类的声明位置?
让依赖注入更加明确,不要花太多心思在上面,或者有机会让别人感到困惑。
归档时间: |
|
查看次数: |
596 次 |
最近记录: |