在 Scalatest 中使用访问修饰符测试私有方法

Testing a private method with access modifier in Scalatest

我有以下问题。

假设我有以下 class(此处的示例:Link):

package com.example.people

class Person(val age: Int)

object Person {
  private def transform(p: Person): Person = new Person(p.age + 1)
}

所以我有一个包,里面有一个 class 和一个私有方法。

现在我知道使用 scalatest 我可以做这样的事情。在我的测试文件夹中,我有:

import org.scalatest.{ FlatSpec, PrivateMethodTester }

class PersonTest extends AnyFunSuite with PrivateMethodTester {

  test("A Person" should "transform correctly") {
      val p1 = new Person(1)
      val transform = PrivateMethod[Person]('transform)
      assert(p2 === p1 invokePrivate transform(p1))
    }
  }

现在,我的问题是,如果我按如下方式向我的私有方法添加访问修饰符(类似于此 Link 中的答案):

package com.example.people

class Person(val age: Int)

object Person {
  private[example] def transform(p: Person): Person = new Person(p.age + 1)
}

测试抱怨 transform 不再是私有方法。

有没有办法我仍然可以使用私有方法测试器,即使我有私有函数的访问修饰符?

给出

package com.example.people

class Person(val age: Int)

object Person {
  private[example] def transform(p: Person): Person = new Person(p.age + 1)
}

你只需要确保相应的测试也在example包中

package example

class PersonTest extends AnyFunSuite {
  test("A Person should transform correctly") {
    val p1 = new Person(1)
    Person.transform(p1)    // transform is now accessible
    ...
    }
  }
}

在这种情况下不需要 PrivateMethodTester 因为 private[example] 使该方法对 example 包的所有成员可用。