Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala PrivateMethodTester与继承_Scala_Scalatest - Fatal编程技术网

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
方法吗?现在,在对子类调用时,无法找到在超类中定义的受保护方法,但我认为这应该是可能的。也许我们可以开张票什么的?