Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

@nijuya_o

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
1
Help us understand the problem. What are the problem?