暗黙のクラスを使用するいくつかのコードをリファクタリングしようとしています。 基本的には、いくつかの単体テストのコードであり、私は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メソッドがコンパニオンオブジェクト内にあり、結果とバリデーターをパラメータとして持つバージョンを持っています。しかし、それらは暗黙的なものではなく、ビルダーのパターンを落とさなければならなかったので、連鎖はしません。
ありがとうございました。魅力のように動作します。これまでに_.methodCall(_)のことを知りませんでした。 –