Тестирование частного метода с модификатором доступа в Scalatest - PullRequest
0 голосов
/ 11 июля 2020

У меня следующая проблема.

Предположим, у меня есть следующий класс (пример отсюда: Link ):

package com.example.people

class Person(val age: Int)

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

Итак, у меня есть пакет, и внутри у меня есть класс с частным методом.

Теперь я знаю, что с помощью 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))
    }
  }

Теперь мой вопрос, если я добавлю модификатор доступа к моему частному методу следующим образом (аналогично ответу в этой Ссылке ):

package com.example.people

class Person(val age: Int)

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

Тест жалуется, что преобразование больше не является частным методом.

Есть ли способ, которым я все еще могу использовать тестер частного метода, даже если у меня есть модификатор доступа для частного метода? функция?

1 Ответ

3 голосов
/ 11 июля 2020

Учитывая

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.

...