[Scala]implicit을 포함한 private 메소드에 대한 테스트가 실패한다 (invokePrivate)

8553 단어 Scala
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에 써 두고 싶었어・・・

    좋은 웹페이지 즐겨찾기