首页 > 解决方案 > PrivateMethodTester 和继承

问题描述

所以我有一堂课:

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

知道如何测试使用类中method定义的内容吗?parentchild

我的用例显然更复杂,因此测试父方法与测试子方法不同。

谢谢你。

编辑

我发现的一种解决方案是更改MyParent#myMethodprotected然后在孩子中使用:

private def wrapMyMethod() = super.myMethod()

标签: scalascalatest

解决方案


这与 scalatest 无关:

基类中的事实意味着def myMethod() = 12private不能从子类中使用。

编译器将无法执行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那么你不需要在子类中创建一个包装器来测试它(作为基本规则,我认为单元测试永远不应该影响实际代码),你可以直接测试受保护的方法基类。

要测试protected方法,您可以在测试类中创建一个新类,该类扩展包含受保护方法的类,并将其包装在公共方法中:

class MyParentMock extends MyParent {
  def wrapMyMethod() = myMethod()
}

test("my_test") {
  assertEquals(12, new MyParentMock().wrapMyMethod())
}

推荐阅读