Scala PrivateMethodTester与继承
所以我有一门课:Scala PrivateMethodTester与继承,scala,scalatest,Scala,Scalatest,所以我有一门课: class MyParent { private def myMethod() = 12 } 还有一节课: class MyChild extends MyParent { } 在我的测试中,我想做: val c = new MyChild() val m = PrivateMethod[MyChild]('myMethod) assertEquals(12, c invokePrivate m()) 但我得到: java.lang.IllegalArgumen
class MyParent {
private def myMethod() = 12
}
还有一节课:
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
你知道如何使用子类测试父类中定义的方法吗
我的用例显然更复杂,因此测试父方法不同于测试子方法
多谢各位
编辑:
我找到的一个解决方案是将MyParent#myMethod
更改为protected
,然后在子对象中设置:
private def wrapMyMethod() = super.myMethod()
这与scalatest无关:
def myMethod()=12
在基类中是private
这一事实意味着它不能从子类中使用
编译器将无法执行new MyChild().myMethod()
,PrivateMethodTester
也无法通过内省调用它
与错误无关:PrivateMethod
的类型参数应该是Int
(被测试方法的返回类型),而不是MyChild
:
您可以在基类上测试它:
val m = PrivateMethod[Int]('myMethod)
new MyParent() invokePrivate m()
代替:
val m = PrivateMethod[MyParent]('myMethod)
new MyParent() invokePrivate m()
如果def myMethod()=12
被设置为protected
,那么您不需要在子类中创建一个包装器来测试它(作为基本规则,我认为单元测试永远不会影响实际代码),您可以直接从基类测试受保护的方法
要测试受保护的
方法,可以在测试类中创建一个新类,扩展包含受保护方法的类,并将其包装到公共方法中:
class MyParentMock extends MyParent {
def wrapMyMethod() = myMethod()
}
test("my_test") {
assertEquals(12, new MyParentMock().wrapMyMethod())
}
这与scalatest无关:
def myMethod()=12
在基类中是private
这一事实意味着它不能从子类中使用
编译器将无法执行new MyChild().myMethod()
,PrivateMethodTester
也无法通过内省调用它
与错误无关:PrivateMethod
的类型参数应该是Int
(被测试方法的返回类型),而不是MyChild
:
您可以在基类上测试它:
val m = PrivateMethod[Int]('myMethod)
new MyParent() invokePrivate m()
代替:
val m = PrivateMethod[MyParent]('myMethod)
new MyParent() invokePrivate m()
如果def myMethod()=12
被设置为protected
,那么您不需要在子类中创建一个包装器来测试它(作为基本规则,我认为单元测试永远不会影响实际代码),您可以直接从基类测试受保护的方法
要测试受保护的
方法,可以在测试类中创建一个新类,扩展包含受保护方法的类,并将其包装到公共方法中:
class MyParentMock extends MyParent {
def wrapMyMethod() = myMethod()
}
test("my_test") {
assertEquals(12, new MyParentMock().wrapMyMethod())
}
你想做的没有任何意义MyChild
没有名为myMethod
的方法,因为它是父类中的私有方法。您想做的事情没有任何意义MyChild
没有名为myMethod
的方法,因为它是父类中的私有方法。噢,谢谢,我看错了!关于这个问题,如果myMethod
变成protected
,那会怎么样?@Wonay确实,你可以包装这个方法,但是你应该通过模拟基类的测试来完成。我更新了答案。谢谢!很好,PrivateMethodTester
不应该能够调用超类的protected
方法吗?现在,在对子类调用时,无法找到在超类中定义的受保护方法,但我认为这应该是可能的。也许我们可以开张票什么的?哦,谢谢,我看错了!关于这个问题,如果myMethod
变成protected
,那会怎么样?@Wonay确实,你可以包装这个方法,但是你应该通过模拟基类的测试来完成。我更新了答案。谢谢!很好,PrivateMethodTester
不应该能够调用超类的protected
方法吗?现在,在对子类调用时,无法找到在超类中定义的受保护方法,但我认为这应该是可能的。也许我们可以开张票什么的?