有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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手动模拟很多这些内部方法,但这显然是一种糟糕的做法

我的问题是:

使用超级方法或像这样扩展类(应该避免子类——组合>;继承),这是一种公平的方法吗? 每当我们测试子类时,是否有必要测试父类? 为了避免这种情况,将使用什么设计模式来适当地重构代码


共 (2) 个答案

  1. # 1 楼答案

    我认为您的输入中有各种“气味”:

    • 从违反java编码约定开始。类名以大写字母开头;但这只是一个旁注
    • 我看到的第一个真正的问题是methodX()有多个实现;并使对超级实现的调用成为子类覆盖中的基本部分。这在类之间引入了非常紧密的耦合

    我将从这一点开始——并研究如何摆脱它;但万一你不能或不想;那么,绝对重要的是,你不要“嘲笑”掉那个超级电话。您希望确保子类的测试运行它们所依赖的代码

    相反:如果你发现你不能合理地测试你的孩子的课程,没有那些嘲弄的技巧;然后,这是另一个指示代码库中存在错误

  2. # 2 楼答案

    是的,这是一个公平的方法

    扩展意味着定义“是”关系

    马自达是一辆汽车

    因此,这是公平的(和必要的)测试马自达实际上可以做任何一辆车做的事情,马自达再利用任何它可以从汽车

    为了避免CarTestMazdaTest之间的代码重复(或最小化),您可以使用CarTestHelper,并将所有要重用的测试代码放在静态帮助器方法中