privateメソッドのテストで invokePrivate
を使います
今回以下のメソッドに対してテストを書いてみました
Hogeを生成するメソッド
object Sample {
private def generateHoge (hogeId: Int, hogeFlag: Boolean, fugaId: Int)
(implicit hogeRepository: HogeRepository,
fugaRepository: FugaRepository) : Hoge = {
...
Hoge(hogeId, hogeName)
}
}
これに対してのテストを記述する
val A = PrivateMethod[返り値] ('メソッド名)
val result = オブジェクト名orクラス名 invokePrivate(A(引数))
result should be Hoge(1, "hogehoge")
今回だとこんな感じ
val generateHoge = PrivateMethod[Hoge] ('generateHoge)
val result = generateHoge invokePrivate(generateHoge(1, true, 1))
result should be Hoge(1, "hogehoge")
これでテストを実行すると、テストに失敗する
java.lang.IllegalArgumentException:
Can't find a private method named: generateHoge
invokePrivateの記述が通ってないみたい?
確認してみる
他のprivateメソッドに対するテストでは、同じ記述で通った
今回の違いは implicit の有無
なんとか渡せるようにしてみる
- 直接渡してみる
val generateHoge = PrivateMethod[Hoge] ('generateHoge)
val result = generateHoge invokePrivate(generateHoge(1, true, 1)(HogeRepository,
FugaRepository))
-> エラー
- 宣言時に渡してみる
val generateHoge = PrivateMethod[Hoge] ('generateHoge)(HogeRepository,
FugaRepository)
val result = generateHoge invokePrivate(generateHoge(1, true, 1))
-> エラー
- 事前にimplicitで宣言しておく
implicit val hogeRepository = HogeRepository
implicit val fugaRepository = FugaRepository
val generateHoge = PrivateMethod[Hoge] ('generateHoge)
val result = generateHoge invokePrivate(generateHoge(1, true, 1))
-> エラー。メソッドの通常呼び出しではないため、implicitを渡してくれない
この辺りで結構手詰まりに。そもそも公式のREADMEに記述が書いてないので無理だと思ってしばらく諦めました。
解決
絶対同じ症状になってる人がいると思って気合いでググりまくっていたら、以下の記事がヒット
全く同じ症状で、回答に「サポートしていないように書かれているが普通の引数のように渡すと可能」との記述
つまりこのように書けば可能になるはず
val generateHoge = PrivateMethod[Hoge] ('generateHoge)
val result = generateHoge invokePrivate(generateHoge(1, true, 1, HogeRepository, FugaRepository))
result should be Hoge(1, "hogehoge")
エラーなし、通りました。
結構長い時間格闘したので、誰かの助けになればなと思います。
せっかく対応してるんだからREADMEに書いておいて欲しかったなぁ・・・