2016-10-25 6 views
0

次の(単純化された)例では、scalamockを持つクラスのフィールドを継承する特性の値をスタブするにはどうすればよいですか?scalamockを持つ特性値をスタブする

trait MyTrait extends MyClass 
class MyClass(val location: Location) 

val expectedValue = ??? 
val dor: MyTrait = stub[MyTrait] 
(dor.location.continuousFeatureValues).returns(expectedValue) 

答えて

0

「位置」はMyClassののパラメータまたはMyClassののデータメンバーでありますか?それがOKであれば、あなたは回避策として場所を上書きすることができます

class MyClass() { 
    val location: Location = new Location 
} 

:それはとしてはMyClassを変更するにはOKです

//source code 
class Location { 
    def continuousFeatureValues: String = "location" 
} 

class MyClass() { 
    val location: Location = new Location 
} 

class MyTrait extends MyClass 

// test code 
it should "mock" in { 
    val loc = mock[Location] 
    val dor: MyTrait = new MyTrait {override val location = loc} 
    (loc.continuousFeatureValues _).expects().returning("good") 
    dor.location.continuousFeatureValues shouldBe ("good") 
} 
+0

locationは、コンストラクタのパラメータとフィールドメンバの両方です。私はMyClassをインスタンス化し、後でそれを使用します - ケースクラスに似ていますが、ケースクラスではありません。このソリューションは、私の実際のプログラムをかなり変更する必要があると思われ、私はテストのためにそれをするのが好きではありません。 – Make42

0

それは死者のビットであるとして、私は、そのコードをリファクタリングしますデフォルト以外のコンストラクタを持つクラスを拡張する特性で終わります。 そのクラスを直接模擬した場合でも、位置にアクションを定義することはできませんでした(val)。これらはScalaでは不変です。 defMyTraitとし、MyClass extend MyTraitとしてください。あなたのデザインはもっと簡単に操作できます(そしてモック)。

関連する問題