2013-08-18 54 views
7

Tôi muốn để có thể thử một giá trị trở lại của getOrElse phương pháp để nó trả lại những gì được thông qua như orElse luận gọi bằng tên với ScalaMockLàm thế nào để giả lập một đối số theo từng tên (như getOrElse) bằng cách sử dụng ScalaMock?

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

ScalaMock đã được sử dụng vì currying. Chạy này:

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") 
    } 
    } 

} 

ném một ngoại lệ:

[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) 

Trả lời

5

Bí quyết là sử dụng Product phiên bản của onCall phương pháp, chuyển đổi đối số thứ hai để () => String và gọi nó là:

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") 
    } 
    } 

}