Kotlin
には Java
には無い便利な機能として 拡張関数
があります。
ただ、困った事に 拡張関数はをモック化できるのか?
という問題にぶち当たりました。
まず、Java
製のモックライブラリでは当然の事ながらそんな事できないですし、有名どころの mockito-kotlin
でも出来なかった(当時は、、、今どうなのかは調べてないです)ので、もうこれは無理かなと諦め書けていた所にさっそうと現れた救世主が mockk でした。
Mock化サンプル
以前、ORMに Kotlin製 の Exposed
というライブラリを使ったのですが、これで書かれたDB操作に 拡張関数
が使われていたのでこれを例にします。
まず拡張関数が書かれているファイルの パッケージ
と ファイル名
を確認します。
Exposed
の拡張関数はこんな感じでした。
package org.jetbrains.exposed.sql
fun <T:Table> T.update(where: SqlExpressionBuilder.()->Op<Boolean>, limit: Int? = null, body: T.(UpdateStatement)->Unit): Int
これに対して、モックを仕掛けるコードは、以下のようになります。
func test() {
// モックを仕掛けます
mockkStatic("org.jetbrains.exposed.sql.QueriesKt")
// 何をモックするかを書きます。
every { HogeTable.update(any(), body = {}) } returns 1
{対象のテスト}
// モックを解除します。
unmockkStatic("org.jetbrains.exposed.sql.QueriesKt")
}
こんな感じで、先に見た対象のパッケージとファイル名を文字列で指定してやることで、そのファイルに対してモックを仕掛けることができます。
mockkStatic("{package}.{file name}Kt")
なお、 unmockkStatic
をやらないと、モックが解除されないので、他のテストに影響がでますので気をつけてください。
最後に
この mockk
ですが、拡張関数以外もちゃんとモック化できるので、 Kotlin
でモックライブラリを捜している場合にはオススメです。