2013-08-18 4 views
7

それはScalaMockScalaMockを使って名前でcall-by-name引数(getOrElseなど)をモックする方法はありますか?

orElseによる呼び出し名を引数として渡されたものを返すように私はScalaMockが原因カリー化を使用する必要があります
trait ToBeMocked { 
    def getOrElse(arg: Int)(orElse: => String): String 
} 

getOrElseメソッドの戻り値を模擬することができるようにしたいと思います。この実行:

class CallByNameMockSpec extends Specification with MockFactory { 

    trait ToBeMocked { 
    def getOrElse(arg: Int)(orElse: => String): String 
    } 

    "Mocking functions with call-by-name arguments" should { 
    "work" in { 
     val m = mock[ToBeMocked] 

     (m.getOrElse (_: Int)(_: String)).expects(101, *).onCall((x, y) => y) 

     m.getOrElse(101)("result") must beEqualTo("result") 
    } 
    } 

} 

と例外がスローされます。

[error]  ClassCastException:   
test.service.CallByNameMockSpec$$anonfun$1$$anonfun$apply$1$$anonfun$apply$3$$anonfun$apply$4 cannot be cast to java.lang.String (CallByNameMockSpec.scala:16) 

答えて

5

トリックは、onCall方法のProductバージョンを使用() => Stringに2つ目の引数を変換し、それを呼び出すことです:

class CallByNameMockSpec extends Specification with MockFactory { 

    trait ToBeMocked { 
    def getOrElse(arg: Int)(orElse: => String): String 
    } 

    "Mocking functions with call-by-name arguments" should { 
    "work" in { 
     val m = mock[ToBeMocked] 

     (m.getOrElse (_: Int)(_: String)).expects(101, *).onCall(_.productElement(1).asInstanceOf[() => String]()) 

     m.getOrElse(101)("result") must beEqualTo("result") 
    } 
    } 

} 
関連する問題