java委托对象产生重复代码:(继承与委托)
在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方法在避免重复测试代码方面非常关键,即测试父类的代码必须在ChildClass中使用。我可以用Mockito手动模拟很多这些内部方法,但这显然是一种糟糕的做法
我的问题是:
使用超级方法或像这样扩展类(应该避免子类——组合>;继承),这是一种公平的方法吗? 每当我们测试子类时,是否有必要测试父类? 为了避免这种情况,将使用什么设计模式来适当地重构代码
# 1 楼答案
我认为您的输入中有各种“气味”:
methodX()
有多个实现;并使对超级实现的调用成为子类覆盖中的基本部分。这在类之间引入了非常紧密的耦合李>我将从这一点开始——并研究如何摆脱它;但万一你不能或不想;那么,绝对重要的是,你不要“嘲笑”掉那个超级电话。您希望确保子类的测试运行它们所依赖的代码
相反:如果你发现你不能合理地测试你的孩子的课程,没有那些嘲弄的技巧;然后,这是另一个指示代码库中存在错误
# 2 楼答案
是的,这是一个公平的方法
扩展意味着定义“是”关系
马自达是一辆汽车
因此,这是公平的(和必要的)测试马自达实际上可以做任何一辆车做的事情,马自达再利用任何它可以从汽车
为了避免
CarTest
和MazdaTest
之间的代码重复(或最小化),您可以使用CarTestHelper
,并将所有要重用的测试代码放在静态帮助器方法中