我遇到了一个关于面向对象Java的情况,让我在为“可测试性”结构化代码时感到困惑。我所做的研究大多指向了委托,这是一种很酷、直接的模式,然而,我认为它会导致大量重复的代码。
总之,我有一个类,其中包含一些冗长的方法。我有一个第二个类,'扩展'了上述冗长的类并覆盖了其中的一些方法。第二个类在覆盖原始方法时调用了super方法(因此第一个类对于减少代码是完全必要的)。
例如:简化后的父类:
裸露的子元素:
总之,我有一个类,其中包含一些冗长的方法。我有一个第二个类,'扩展'了上述冗长的类并覆盖了其中的一些方法。第二个类在覆盖原始方法时调用了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(扩展并重写其父类方法的类)编写测试类非常困难,因为我们调用了一个超级方法!超级方法在避免重复测试代码方面非常关键,即测试 ParentClass 的代码将必须在 ChildClass 中使用。我可以使用 Mockito 手动模拟许多这些内部方法,但这绝对似乎是可怕的做法。
我的问题:
这是使用超级方法或扩展类的公平方式吗?是否应该完全避免使用子类(组合>继承)? 在测试子类时是否有必要测试 ParentClass? 应使用哪些设计模式适当地重构代码以避免此情况?