PrivateMethodTester 和继承
PrivateMethodTester and Inheritance
所以我有一个 class:
class MyParent {
private def myMethod() = 12
}
还有一个class:
class MyChild extends MyParent {
}
在我的测试中我想做的是:
val c = new MyChild()
val m = PrivateMethod[MyChild]('myMethod)
assertEquals(12, c invokePrivate m())
但我得到:
java.lang.IllegalArgumentException: Can't find a private method named: myMethod
知道如何使用 child
class 测试 parent
中定义的 method
吗?
我的用例显然更复杂,因此测试 parent 方法与测试 child 方法不同。
谢谢。
编辑:
我找到的一个解决方案是将 MyParent#myMethod
更改为 protected
,然后在 child:
private def wrapMyMethod() = super.myMethod()
这与 scalatest 无关:
事实上 def myMethod() = 12
在基础 class 中是 private
意味着它不能从 child classes 使用。
编译器将无法执行 new MyChild().myMethod()
,PrivateMethodTester
也无法通过内省调用它。
与错误无关:PrivateMethod
的类型参数应该是Int
(被测方法的return类型)而不是MyChild
:
你可以在底座上测试class:
val m = PrivateMethod[Int]('myMethod)
new MyParent() invokePrivate m()
而不是:
val m = PrivateMethod[MyParent]('myMethod)
new MyParent() invokePrivate m()
如果 def myMethod() = 12
是 protected
那么你不需要在 child class 中创建一个包装器来测试它(作为基本规则,我认为单元测试不应该影响实际代码),您可以直接从基本 class.
测试受保护的方法
要测试 protected
方法,您可以在测试 class 中创建一个新的 class,它扩展包含受保护方法的 class 并将其包装在public 方法:
class MyParentMock extends MyParent {
def wrapMyMethod() = myMethod()
}
test("my_test") {
assertEquals(12, new MyParentMock().wrapMyMethod())
}
所以我有一个 class:
class MyParent {
private def myMethod() = 12
}
还有一个class:
class MyChild extends MyParent {
}
在我的测试中我想做的是:
val c = new MyChild()
val m = PrivateMethod[MyChild]('myMethod)
assertEquals(12, c invokePrivate m())
但我得到:
java.lang.IllegalArgumentException: Can't find a private method named: myMethod
知道如何使用 child
class 测试 parent
中定义的 method
吗?
我的用例显然更复杂,因此测试 parent 方法与测试 child 方法不同。
谢谢。
编辑:
我找到的一个解决方案是将 MyParent#myMethod
更改为 protected
,然后在 child:
private def wrapMyMethod() = super.myMethod()
这与 scalatest 无关:
事实上 def myMethod() = 12
在基础 class 中是 private
意味着它不能从 child classes 使用。
编译器将无法执行 new MyChild().myMethod()
,PrivateMethodTester
也无法通过内省调用它。
与错误无关:PrivateMethod
的类型参数应该是Int
(被测方法的return类型)而不是MyChild
:
你可以在底座上测试class:
val m = PrivateMethod[Int]('myMethod)
new MyParent() invokePrivate m()
而不是:
val m = PrivateMethod[MyParent]('myMethod)
new MyParent() invokePrivate m()
如果 def myMethod() = 12
是 protected
那么你不需要在 child class 中创建一个包装器来测试它(作为基本规则,我认为单元测试不应该影响实际代码),您可以直接从基本 class.
要测试 protected
方法,您可以在测试 class 中创建一个新的 class,它扩展包含受保护方法的 class 并将其包装在public 方法:
class MyParentMock extends MyParent {
def wrapMyMethod() = myMethod()
}
test("my_test") {
assertEquals(12, new MyParentMock().wrapMyMethod())
}