2016-03-22 58 views
0

我在main和test代碼樹中定義了一個包對象,如下所示。當我使用sbt run執行程序時,主代碼樹中的一個會生效。而當我運行測試用例(sbt test)時,測試代碼樹中定義的包對象會生效。對於例如在main和test中複製包對象

的src /主/階/ COM /示例/ package.scala

package object core { 
    val foo = "Hello World" 
} 

的src /測試/階/ COM /示例/ package.scala

package object core { 
val foo = "Goodbye World" 
} 

sbt runcom.example.core.foo的值是Hello World。在sbt testcom.example.core.foo再見世界

這只是SBT的怪癖或者是一個定義良好的斯卡拉/舒巴坦特質?我目前使用這種行爲進行依賴項注入,方法是在相應的包對象中定義用於生產和測試的模塊綁定。這是一個明智的做法?

回答

1

Scala會在當前路徑中查找包對象,因此它是一個明確定義的行爲。由於testmain中的代碼位於不同的地方,因此它找到不同的val foo s。

您使用這種機制的方式與使用implicits非常相似。暗含和暗含的解決方法的一般建議不是濫用它。我認爲在這種情況下,它不是提供依賴關係的最佳方式。

你總是要考慮什麼範圍,你是 - 如果你正在使用test範圍你怎麼用foomainmain定義的類,以及你如何使用footest - 當您需要一個或其他。你必須考慮它將如何工作並考慮各種情況。如果你的測試課程是在一個不同的包中,你會得到foo,這取決於你的測試課程在哪裏申報?

使依賴注入更加明確,不要花費精神週期,或運行一個機會讓人困惑。

+0

在測試範圍內說。當一個測試類調用一個主類和主類引用該包對象時,我仍然可以獲得測試包對象的值。即使測試類位於不同的包中。 com.example.anotherpackage ..我在測試中得到了package對象的值...所以package對象變量的值始終是一致的,與調用者類的位置無關,而僅取決於當前範圍.. main或test .. –