【问题标题】:duplicate package objects in main and test在 main 和 test 中重复包对象
【发布时间】:2016-07-08 21:02:11
【问题描述】:

我在主代码树和测试代码树中都定义了一个包对象,如下所示。当我使用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 的值为Goodbye World

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

【问题讨论】:

    标签: scala sbt


    【解决方案1】:

    Scala 在您当前的路径中查找包对象,因此这是一个定义明确的行为。由于您在 testmain 中的代码位于不同的位置,因此会发现不同的 val foos。

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

    你总是要考虑你在什么范围内——如果你在test范围内使用main中定义的类,你如何使用main中的foo,以及如何使用foo来自test - 无论何时需要其中之一。您必须已经考虑过它将如何工作并考虑各种场景。如果你的测试类在不同的包中,你会得到foo,这取决于你的测试类在哪里声明?

    使依赖注入更加明确,不要在上面花费精神周期,或者有机会让某人感到困惑。

    【讨论】:

    • 在测试范围内说。当一个测试类调用一个主类并且主类引用包对象时..我仍然得到测试包对象的值..即使测试类在不同的包中。 com.example.anotherpackage..我在测试中获取包对象的值...所以包对象变量的值始终是一致的,无论调用者类在哪里,但仅取决于当前范围..主或测试..
    猜你喜欢
    • 2021-08-24
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 2011-08-17
    • 2011-04-12
    • 2013-11-04
    • 2017-11-01
    相关资源
    最近更新 更多