【问题标题】:JUnit extend base class and have tests in that class being runJUnit 扩展基类并在该类中运行测试
【发布时间】:2011-01-09 10:17:24
【问题描述】:

我正在使用 JUnit 3,并且经常需要测试是否正确创建了对象。我的想法是编写一个类MyTestBase,如下所示,然后针对特定情况的单元测试进行扩展。

但是在我给出的示例中,MyTests 不会在 MyTestBase 中运行测试。

public class MyTestBase extends TestCase {
   protected String foo;
   public void testFooNotNull() {
     assertNotNull(foo);
   }
   public void testFooValue() {
     assertEquals("bar", foo);
   }
}


public class MyTests extends MyTestBase {
  public void setUp() {
    this.foo = "bar";
  }
  public void testSomethingElse() {
    assertTrue(true);
  }
}

我做错了什么?

更新抱歉。愚蠢的错误。我的基类中的测试命名不正确。

【问题讨论】:

  • 因为系统是用Java 1.4.2编写的
  • 我投票结束了这个问题,因为它是错误的。它没有提出真正的问题。
  • @JohnOxley 这么多年过去了,我投票决定关闭是一个错字/无法复制(因为它就是这样)。看到这几乎发生在十年前,有点有趣:)

标签: java unit-testing junit junit3


【解决方案1】:

好吧,您可以将MyTestBase 抽象化,这样它就不会尝试在基类中运行测试。更好的解决方案是在基类中添加setUp,并使其调用抽象方法(例如getFoo())来初始化稍后需要的变量。

事实上,如果你有这些抽象方法,你可能会发现你甚至不需要设置阶段——你可以在需要值的地方调用抽象方法,而不是使用实例变量。显然这将取决于具体情况,但在许多情况下,这可能会更干净。

【讨论】:

    【解决方案2】:

    您说过“MyTests 不在 MyTestBase 中运行测试。”。我试了一下,所有测试都被调用了,包括 MyTestBase 中的那些。

    【讨论】:

    • 是的,我在 Eclipse 中使用 JUnit 3 进行了尝试。我将 MyTests 类作为 JUnit 测试运行,所有测试均成功通过。
    • 不错。那么这个问题是无关紧要的:)
    【解决方案3】:

    您尝试做的并不是实现目标的最合适方式:

    如果您想拥有进行一些检查的通用功能

    • 在实用程序类中定义它,在static 方法中
    • 在超类中定义它并从每个测试方法中调用它

    【讨论】:

      【解决方案4】:

      我不知道你到底想做什么,但通常在测试中过多的公共部分不是一个好主意,因为当公共部分失败时,你将有大量的测试失败甚至艰难您的软件中可能只有一个小错误。

      我建议您使用 Factory 或 Builder 来创建复杂对象,然后测试 Factory(或 Builder)以正确创建对象。

      【讨论】:

        猜你喜欢
        • 2023-03-25
        • 2023-03-23
        • 2011-01-30
        • 2015-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-10
        • 2012-03-14
        相关资源
        最近更新 更多