9
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Kotlin の拡張関数を Mock する

Posted at

Kotlin には Java には無い便利な機能として 拡張関数 があります。
ただ、困った事に 拡張関数はをモック化できるのか? という問題にぶち当たりました。

まず、Java 製のモックライブラリでは当然の事ながらそんな事できないですし、有名どころの mockito-kotlin でも出来なかった(当時は、、、今どうなのかは調べてないです)ので、もうこれは無理かなと諦め書けていた所にさっそうと現れた救世主が mockk でした。

Mock化サンプル

以前、ORMに Kotlin製 の Exposed というライブラリを使ったのですが、これで書かれたDB操作に 拡張関数 が使われていたのでこれを例にします。

まず拡張関数が書かれているファイルの パッケージファイル名 を確認します。
Exposed の拡張関数はこんな感じでした。

Queries.kt
package org.jetbrains.exposed.sql

fun <T:Table> T.update(where: SqlExpressionBuilder.()->Op<Boolean>, limit: Int? = null, body: T.(UpdateStatement)->Unit): Int 

これに対して、モックを仕掛けるコードは、以下のようになります。

hogetest.kt
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 でモックライブラリを捜している場合にはオススメです。

9
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?