gdi*_*azc 34 testing scala scalatest
我有一个私有方法的伴侣对象,如下所示:
package com.example.people
class Person(val age: Int)
object Person {
private def transform(p: Person): Person = new Person(p.age + 1)
}
Run Code Online (Sandbox Code Playgroud)
我想测试这个方法,例如:
class PersonSpec extends FlatSpec {
"A Person" should "transform correctly" in {
val p1 = new Person(1)
val p2 = Person.transform(p1) // doesn't compile, because transform is private!
assert( p2 === new Person(2) )
}
}
Run Code Online (Sandbox Code Playgroud)
有关测试代码访问私有方法的任何帮助吗?
实际上,正如它所写,我可能能够创建一个子类Person,但如果Person被声明为final或sealed?
谢谢!
jle*_*ler 60
在测试一切时,我处于中间位置.我通常不测试所有内容,但有时能够对私有函数进行单元测试而不必破坏我的代码以使其成为可能是非常有用的.如果您使用的是ScalaTest,则可以使用PrivateMethodTester来执行此操作.
import org.scalatest.{ FlatSpec, PrivateMethodTester }
class PersonSpec extends FlatSpec with PrivateMethodTester {
"A Person" should "transform correctly" in {
val p1 = new Person(1)
val transform = PrivateMethod[Person]('transform)
assert(p2 === invokePrivate transform(p1))
}
}
Run Code Online (Sandbox Code Playgroud)
这可能不是你想要做的,但你明白了.
vpt*_*ron 29
您可以将您的方法声明为包私有:
private[people] def transform(p: Person): Person = new Person(p.age + 1)
Run Code Online (Sandbox Code Playgroud)
如果您将PersonSpec放在同一个包中,它将能够访问它.
我留给你来决定单元测试一个私有方法是否真的明智:)
对私有方法进行单元测试的需求是一种设计气味.
要么通过公共API测试它们,如果它们很小并且只是辅助方法就可以了 - 或者,更可能的是,它包含不同的逻辑/责任,应该移动到Person中委托使用的另一个类.然后,您将首先测试该类的公共API.
有关详细信息,请参阅相关答案.
可能你可以使用Java/Scala反射来访问它,但它只是设计问题的一种解决方法.不过,如果需要,请参阅相关的Java答案如何做到这一点.
| 归档时间: |
|
| 查看次数: |
23144 次 |
| 最近记录: |