使用 PrivateMethodTester 测试柯里化方法

Test curried method using PrivateMethodTester

我正在尝试使用 curried private 方法(实际上是 functionPrivateMethodTester 但不知道如何调用它

考虑以下 curried 方法:

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)
..


框架版本:

以下对我使用 ScalaTest 3.0.1 有效:

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

根据docs

The private method is invoked dynamically via reflection

当我听到 反射 我想到了 Object.getClass(),所以调用 MyObject.getClass.getDeclaredMethods.foreach(println) 方法显示为

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

所以 curriedAdder(int,int) 提示了我如何调用这个柯里化方法。