2016-03-22 15 views
0

パッケージオブジェクトは、以下のようにメインコードとテストコードツリーの両方に定義されています。 sbt runでプログラムを実行すると、メインコードツリーのプログラムが有効になります。テストケース(sbt test)を実行すると、テストコードツリーで定義されたパッケージオブジェクトが有効になります。例えばメインとテストの重複パッケージオブジェクト

のsrc /メイン/スカラ座/ COM /例/ package.scala

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

のsrc /テスト/スカラ座/ COM /例/ package.scala

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

sbt runの場合、com.example.core.fooの値はHello Worldです。 sbt testcom.example.core.fooの値は、さよなら世界

は、SBTのこの単なる気まぐれですか、それは明確に定義されたスカラ/ SBTの特色ある?です。私は現在、依存関係の注入にこの動作を使用しています。モジュールバインディングをプロダクション用に定義し、対応するパッケージオブジェクトでテストします。これはお勧めのアプローチですか?

答えて

1

Scalaはあなたの現在のパスにあるパッケージオブジェクトを探します。そのため、よく定義された動作です。 testmainのコードは別の場所にあるため、異なるval fooが見つかりました。

このメカニズムを使用する方法は、implicitsを使用する方法と非常によく似ています。含意と暗黙の解決に関する一般的な助言は、それを乱用するものではありません。私はこの場合、依存関係を提供する最良の方法ではないと思います。

あなたはいつもあなたが何であるかの範囲を検討する必要があります - あなたは、1つまたは必要なとき - あなたはどのようにあなたがmainからfooを使用しない、そしてどのようにあなたがtestからfooを使用しないtest範囲でmainで定義されたクラスを使用している場合、その他。あなたはすでにそれがどのように動作するかについて考えなければならず、さまざまなシナリオを考慮する必要があります。テストクラスが別のパッケージにある場合は、fooとなりますが、テストしたクラスが宣言されている場所によって異なりますか?

依存性の注入をより明示的にし、精神的な循環を費やさず、誰かを混乱させるチャンスを与えます。

+0

テストスコープで言う。テストクラスがメインクラスを呼び出し、メインクラスがパッケージオブジェクトを参照するとき。私はまだテストパッケージオブジェクトの値を取得します。テストクラスが別のパッケージであっても。 com.example.anotherpackage ..私はパッケージオブジェクトの値をテスト中にしています...パッケージオブジェクト変数の値は、呼び出し側クラスがどこにあるかに関係なく常に一致しますが、現在のスコープに依存します.. mainまたはtest .. –

関連する問題