scala - 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
定义的内容吗?parent
child
我的用例显然更复杂,因此测试父方法与测试子方法不同。
谢谢你。
编辑:
我发现的一种解决方案是更改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
那么你不需要在子类中创建一个包装器来测试它(作为基本规则,我认为单元测试永远不应该影响实际代码),你可以直接测试受保护的方法基类。
要测试protected
方法,您可以在测试类中创建一个新类,该类扩展包含受保护方法的类,并将其包装在公共方法中:
class MyParentMock extends MyParent {
def wrapMyMethod() = myMethod()
}
test("my_test") {
assertEquals(12, new MyParentMock().wrapMyMethod())
}
推荐阅读
- c# - 如何检查 MongoDB C# 中的索引(是否存在),因为 IndexExist 已从较新版本中弃用
- spring-boot - 使用 kotlin 时如何将 @RequestParams 传递给嵌套的 POJO
- c# - asp.net iis 要求登录两次
- html - 强制asp.net列表控件为空时生成html
- java - 由于 java.lang.NoClassDefFoundError: org.gradle.api.internal.ClosureBackedAction,带有 jdk 11 构建的 Gradle 5 失败
- android - 我们可以只为一个文本视图启用辅助功能吗?
- php - 无法使用 Microsoft 帐户登录
- java - 单向 @OneToMany 不能按预期使用 @EmbeddedId
- amazon-web-services - Gitlab runner 无法运行 aws 命令
- javascript - 获取 api 句柄并读取错误响应