Протестируйте метод карри, используя PrivateMethodTester - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь протестировать карри приватный метод (на самом деле функция ), используя PrivateMethodTester, но не могу понять, как его вызвать

Рассмотрим следующий curry метод:

object MyObject {
  ..
  private def curriedAdder(augend: Int)(addend: Int): Int = augend + addend
  ..
 }

Следующее дает ошибку компиляции

assert(9, MyObject.invokePrivate(PrivateMethod[Int]('curriedAdder)(2)(7)))

..
[error] /path/to/MyObject.scala:76:80: org.scalatest.PrivateMethodTester.Invocation[Int] does not take parameters
[error]     assert(9, MyObject.invokePrivate(PrivateMethod[Int]('curriedAdder)(2)(7)))
[error]                                                                                ^
..

Хотя эта не может найти функцию

assert(9, MyObject.invokePrivate(PrivateMethod[Int => Int]('curriedAdder)(2))(7))

..
[info] - my-test-name *** FAILED ***
[info]   java.lang.IllegalArgumentException: Can't find a private method named: curriedAdder
[info]   at org.scalatest.PrivateMethodTester$Invoker.invokePrivate(PrivateMethodTester.scala:247)
..

  • Можно ли вообще протестировать карри-приватные методы с использованием PrivateMethodTester?
  • Если да, то где я ошибаюсь??

Версии каркаса:

  • "org.scalatest" %% "scalatest" % "3.0.3" % Test
  • scalaVersion := "2.11.11"
  • sbt.version=1.0.3

1 Ответ

0 голосов
/ 11 июня 2018

С ScalaTest 3.0.1 у меня сработало следующее:

val curriedAdder = PrivateMethod[Int]('curriedAdder)
val actualResult = (MyObject invokePrivate curriedAdder(2, 7))
assert(9 == actualResult)

Согласно документам :

Закрытый метод вызывается динамически через отражение

Когда я слышу отражение , я думаю о Object.getClass(), поэтому при вызове MyObject.getClass.getDeclaredMethods.foreach(println) метод обнаруживается как

private int example.HelloSpec$MyObject$.curriedAdder(int,int)

и так curriedAdder(int,int) был подсказкой для меня, как вызвать этот метод карри.

...