【发布时间】:2017-04-06 16:05:43
【问题描述】:
我在 OOP Java 世界中遇到了一种情况,这让我在寻找构建“可测试性”代码的理想方法时遇到了困难。我所做的研究主要针对代表,这是一个很酷、很直接的pattern,但是,我相信它会导致大量重复代码。
总之,我有一个包含一些冗长方法的类。我有第二个类,它“扩展”了上述冗长的类并覆盖了一些上述方法。第二个类调用 super 方法同时覆盖原来的方法(因此第一个类对于减少代码是完全必要的)。
示例: 被剥离的父母:
public class ParentClass {
public void methodX(final int source, final int target) {
++++
++++
++++
}
}
脱衣舞的孩子:
public class ChildClass extends ParentClass {
@Override
public void methodX(final int source, final int target) {
super.methodX(source, target)
****
****
**** // extra logic
}
}
我的想法和问题:
为 ChildClass(扩展和覆盖其父方法的类)编写测试类非常困难,因为我们称之为超级方法! super 方法对于避免重复测试代码非常关键,即测试 ParentClass 的代码必须在 ChildClass 中使用。我可以使用 Mockito 手动模拟很多这些内部方法,但这绝对是一种糟糕的做法。
我的问题:
这是使用超级方法或扩展这样的类的公平方式吗(应该避免子类——组合>继承)? 每当我们测试子类时,是否需要测试 ParentClass? 将使用哪些设计模式来适当地重构代码以避免这种情况?
【问题讨论】:
-
尽管组合比继承更受青睐,但不幸的是,在 Java 中设置委派给组合的样板代码是必需的——这太糟糕了。有一些语言可以自动为你做这个委托——例如,有 JVM 语言 Kotlin,我相信 golang 做同样的事情。专注于减少 Java 样板代码的 Lombok 项目有一个“实验性”委托功能,您可能想看看:projectlombok.org/features/Delegate.html
标签: java oop design-patterns delegates