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() = 12protected 那么你不需要在 child class 中创建一个包装器来测试它(作为基本规则,我认为单元测试不应该影响实际代码),您可以直接从基本 class.

测试受保护的方法

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

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

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