Androidで単体テストを書く時にコールバックの戻り値をモックする

あまり出番はないかもしれませんが、たまにあるクラスからコールバックで返ってきた値を使って何か行うというコードを書く時があります。
そのような処理が書かれたクラスを単体テストする方法が分からなかったので調べました。

解決方法

Androidアプリ開発において上記のようなケースで単体テストを書きたい場合はMockitoのInvocationOnMockを使います。
mockito-kotlinを使って書く場合は下記のようになります。

1
2
3
4
5
6
7
8
9
interface Hoge {
fun getOrCreate(listener: (String?) -> Unit)
}

val hoge: Hoge = mock()
whenever(hoge.getOrCreate(any())).thenAnswer { invocation ->
val listener = invocation.arguments[0] as ((String?) -> Unit)
listener.invoke("test")
}

Hogeインターフェースをモックしメソッド実行時の挙動を定義します。
InvocationOnMockからgetOrCreateの第1引数を取り出し、それを発火させます。
その結果、プロダクトコード側のgetOrCreateメソッドがコールバックを返す挙動を単体テストで再現することができます。
Hogeの具象クラス側の実装が単体テストできない時等に有効です。

参考サイト

https://stackoverflow.com/questions/48204784/unit-test-for-kotlin-lambda-callback