LoginSignup
1
0

More than 3 years have passed since last update.

[Scala]implicitを含むprivateメソッドへのテストが失敗する(invokePrivate)

Posted at

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の記述が通ってないみたい? :thinking:

確認してみる

他の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に書いておいて欲しかったなぁ・・・

1
0
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
1
0