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

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

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に記述が書いてないので無理だと思ってしばらく諦めました。

解決

絶対同じ症状になってる人がいると思って気合いでググりまくっていたら、以下の記事がヒット

https://stackoverflow.com/questions/34172387/how-to-invokeprivate-on-a-function-with-implicit-parameters

全く同じ症状で、回答に「サポートしていないように書かれているが普通の引数のように渡すと可能」との記述

つまりこのように書けば可能になるはず

val generateHoge = PrivateMethod[Hoge] ('generateHoge)
val result = generateHoge invokePrivate(generateHoge(1, true, 1, HogeRepository, FugaRepository))

result should be Hoge(1, "hogehoge")

エラーなし、通りました。

結構長い時間格闘したので、誰かの助けになればなと思います。
せっかく対応してるんだからREADMEに書いておいて欲しかったなぁ・・・

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
No 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
ユーザーは見つかりませんでした