【问题标题】:Should I unit test methods which are inherited from super class?我应该对从超类继承的方法进行单元测试吗?
【发布时间】:2010-09-29 03:40:06
【问题描述】:

我目前正在以 TDD 方式编写 JDBC 驱动程序的实现(是的,你没看错),虽然此时我只完成了类存根,并且只有一些次要功能,我突然想到,由于StatementPreparedStatement 的超类,CallableStatement 的超类,所以当我真正开始为这些类的实现编写测试时我应该怎么做,我应该其中一个做:

  1. Statement 创建一个测试套件,然后扩展该套件以对PreparedStatement 进行其他测试,然后对CallableStatement 执行相同的操作。
  2. 单独测试每个实现,忽略从超类继承的方法。
  3. 为每个实现类单独严格测试每个方法;毕竟,某些继承的方法可能会因实现而有所不同。一个轻微的变化是我会测试实现使用的所有继承方法。

第二个感觉最自然,但由于我放在第三个的原因,我不确定这样做是否明智。那么,认为我应该怎么做?

【问题讨论】:

    标签: java unit-testing tdd junit


    【解决方案1】:

    “为每个实现类单独测试每个方法”

    特别是,未能正确覆盖超类方法是一个常见错误。子类的作者对超类做出假设。超类发生了变化,而子类现在被破坏了。

    【讨论】:

    • 这是正确的做法。您需要确保所有方法仍然有效。
    • 假设我有超类A和子类BCA 具有 a() 方法,BC 都没有覆盖。你是说,尽管如此,我的测试需要测试A.a()B.a()C.a(),即使它正在测试完全相同的方法(BC 都没有覆盖它,只是继承它)3不同时期??我猜在测试时忘记 DRY
    【解决方案2】:

    如果这意味着您将为每个测试子类重复运行相同的测试,我绝对不会做替代 1(让测试类层次结构与实际的类层次结构相同)。除了通用实用程序基类之外,我通常也对子类化测试类持怀疑态度。

    我通常对层次结构中的每个类进行 1 次测试,无论是否抽象。所以基类有一个单独的测试(通常带有一个用于专门测试它的本地测试私有子类),我利用我对子类的了解为每个子类编写适当的测试。我可以在覆盖运行中看到缺少的测试,所以我通常不会提前太正式。

    【讨论】:

      【解决方案3】:

      根据您对实施的了解,提供足够多的测试,让您感觉舒适。我不将单元测试视为完全的黑盒测试。如果您知道基类从不调用任何虚拟方法(或至少没有被覆盖),请注意这一事实,但不要有效地复制您已经获得的单元测试。

      单元测试当然可以走极端——平衡你从中获得的价值和付出的努力总是值得的。

      【讨论】:

        【解决方案4】:

        使用 TDD,您的目标不应该是测试方法,而是代码的行为或功能。因此,在实现子类时,您可以限制只测试与基类不同的行为。如有疑问,请编写一个新测试。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-01
          • 2015-02-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多