我在主代码树和测试代码树中都定义了一个包对象,如下所示。当我使用 sbt run
执行程序时主代码树中的那个生效。而当我运行测试用例 (sbt test
) 时,测试代码树中定义的包对象生效。例如
src/main/scala/com/example/package.scala
package object core {
val foo = "Hello World"
}
src/test/scala/com/example/package.scala
package object core {
val foo = "Goodbye World"
}
在
sbt run
com.example.core.foo
的值是 Hello World .在 sbt test
com.example.core.foo
的值是 再见世界这只是 SBT 的一个怪癖还是一个定义明确的 scala/sbt 特征?我目前通过在其相应的包对象中定义用于生产和测试的模块绑定(bind)来将此行为用于依赖注入(inject)。这是一个可取的做法?
最佳答案
Scala 在您当前的路径中查找包对象,因此这是一个定义明确的行为。由于您的代码在 test
和 main
居住在不同的地方它发现不同val foo
s。
您使用此机制的方式与使用隐式非常相似。隐含和隐含解决的一般建议是不要滥用它。我认为在这种情况下,这不是提供依赖项的最佳方式。
你总是需要考虑你在什么范围内——如果你使用的是 main
中定义的类。在 test
范围你怎么用foo
来自 main
,以及如何使用 foo
来自 test
- 当您需要其中一个时。您必须已经考虑过它将如何工作并考虑各种场景。如果您的测试类在不同的包中怎么办,foo
你会得到,这是否取决于你的测试类在哪里声明?
使依赖注入(inject)更加明确,不要在上面花费精神周期,或者有机会让某人感到困惑。
关于scala - 在 main 和 test 中重复包对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36146534/