2016-12-12 7 views
3

暗黙のクラスを使用するいくつかのコードをリファクタリングしようとしています。 基本的には、いくつかの単体テストのコードであり、私はMockitoと嘲笑してスパイしています。暗黙のクラスと関数のスカラー

以下の例では、暗黙的なクラスAでこれらの関数の模擬が行われます。それぞれのメソッドoverrideXは期待される結果をとり、myObjのメソッドXの呼び出しをオーバーライドし、myObj(easy chaining multiple後で上書きする)。

object Outer { 
    "call to abc" should { 
    "fail if call to X fails" in { 
     val failReason = "X failed" 
     val myObjMock = B 

     myObjMock.overrideX(failReason) 
     myObjMock.abc mustEqual failReason 
    } 

    "fail if call to Y fails" in { 
     val failReason = "Y failed" 
     val myObjMock = B 

     myObjMock.overrideY(failReason) 
     myObjMock.abc mustEqual failReason 
    } 
    } 

    implicit class A(myObj: B) { 
    def overrideX(result: Result): B = { 
     //override call to X in myObj with result 
     myObj 
    } 

    def overrideY(result: Result): B = { 
     //override call to Y in myObj with result 
     myObj 
    } 
    } 
}  

私が解決しようとしている問題は、テストで多くのボイラープレートを排除することです。上記の例のように、これらの2つのテストは非常によく似ています。 私が達成したいのは、オーバーライドメソッドを取り、実際のチェックを行う両方の方法に共通のメソッドを作成することです。

def somethingElse(result: Result, f: Result => B) = { 
    val myObjMock = B 
    myObjMock.f(result).abc mustEqual result 
} 

テストでは、私がoverrideXとoverrideYメソッドがクラスにしていないコンパニオンオブジェクトであることを知っている

"call to abc" should { 
    "fail if call to X fails" in { 
     val failReason = "X failed" 
     somethingElse(failReason, overrideX) 
    } 

    "fail if call to Y fails" in { 
     val failReason = "Y failed" 
     somethingElse(failReason, overrideY) 
    } 
    } 

ようになります。

私は現在、overrideXXメソッドがコンパニオンオブジェクト内にあり、結果とバリデーターをパラメータとして持つバージョンを持っています。しかし、それらは暗黙的なものではなく、ビルダーのパターンを落とさなければならなかったので、連鎖はしません。

答えて

2

Result => Bの代わりに(B, Result) => Bが必要だと思います。関数を含む変数fがある場合は、myObjMock.f(...)のようなオブジェクト上で呼び出すことはできません。しかし、のようにmyObjMockfに渡すことができます。

def somethingElse(result: Result, f: (B, Result) => B) = { 
    val myObjMock = B 
    f(myObjMock, result).abc mustEqual result 
} 

"call to abc" should { 
    "fail if call to X fails" in { 
    val failReason = "X failed" 
    somethingElse(failReason, _.overrideX(_)) 
    } 

    "fail if call to Y fails" in { 
    val failReason = "Y failed" 
    somethingElse(failReason, _.overrideY(_)) 
    } 
} 
+0

ありがとうございました。魅力のように動作します。これまでに_.methodCall(_)のことを知りませんでした。 –

関連する問題