Help us understand the problem. What is going on with this article?

Kotlin の拡張関数を Mock する

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away