【问题标题】:Can sub-classes modify behavior of static methods in an abstract super-class in Java?子类可以修改 Java 中抽象超类中静态方法的行为吗?
【发布时间】:2011-06-23 14:51:52
【问题描述】:

我正在使用“参数化”运行器来执行一些测试。我正在从 XML 文件生成测试数据。这工作正常。

现在我想将此行为应用于多个测试类,而无需复制测试数据生成代码。所以我创建了一个抽象类,它负责从“一个”XML 文件中填充测试数据。如果子类能分辨出使用哪个 XML 文件,我的目标就达到了。

但我一直找不到办法。

这是我的超类

@RunWith(Parameterized.class)
public abstract class AbstractXMLDrivenTest{
     @@Parameters
     public static Collection<Object[]> generateData () {
         /* Reads an XML File and returns test input data */
     }
}

这是一个子类

public class TestSomeThing extends AbstractXMLDrivenTest {
     public TestSomeThing(args) {
     /* Args are populated by generateData in superclass */
     }
}

如果我在 AbstractXMLDrivenTest 中使用用于 TestSomething 的 XML 文件,这将正常工作。 我希望 XML 文件由子类(即 TestSomething)定义,这样我也可以将超类与其他测试用例一起使用。我希望这现在很清楚了。

【问题讨论】:

  • 这里没有明白重点。为什么在静态方法中生成 XML?为什么解决方案必须包含继承(与组合)。

标签: java oop inheritance static-methods


【解决方案1】:

Java 中没有静态方法的继承。此外,静态方法的类是否是抽象的,这对静态方法没有影响——一个类只有静态方法的作用域函数。

为了使用继承,请使用非静态方法。这样您就可以从子类的非静态方法或非静态字段中提取 XML 文件名。

【讨论】:

  • 参数化测试运行器要求测试数据生成是静态的。它的工作方式是,它为所有测试运行静态生成测试数据,然后为每个测试数据实例创建测试用例对象并执行测试用例。
  • 好的——在这种情况下,您可以从静态方法调用非静态方法,例如从generateDatareturn new TestSomeThing().nonStaticGenerateData(); 或类似的(我不知道你的确切参数。
  • 但是超类将引用子类,我将无法将超类用于另一个子类。
  • 我想覆盖超类的静态行为是不可能的。
  • 这没关系——因为正如我所说的,静态方法与类没有 OO 关系。可以调用任何类,包括子类。至少在我的书中:)
【解决方案2】:

不,子类不能覆盖静态方法。

http://www.coderanch.com/how-to/java/OverridingVsHiding

【讨论】:

    【解决方案3】:

    Java 中的静态方法不能被覆盖——不管这个类是否是抽象的。

    【讨论】:

      【解决方案4】:

      如果您的 xml 文件名存储为超类的静态成员,请让您的子类在调用 generateTestData 之前分配该值。

      【讨论】:

        【解决方案5】:

        只有一个子类就足够了。无需增加测试子类,只需在不同的测试文件上调用您的测试方法。实际上,你最好不要让你的测试类成为一个子类,而只是一个单独的类。

        如果您想使用行业标准测试,请查看 JUnit。

        编辑:
        您没有仔细阅读文档。您根本不需要子类: 您将各种测试用例构建为generateData 构建的数组。 在您的情况下,您将拥有一对{("test1.xml", objectResult1), ("test2.xml", objectResult2),...} 形式的数组。测试类的构造函数的形式是 ParametrizedTest(String fileXML, ObjectResult result).

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-03
        • 1970-01-01
        • 2013-06-28
        • 1970-01-01
        • 1970-01-01
        • 2021-01-10
        • 2011-09-26
        • 1970-01-01
        相关资源
        最近更新 更多