【问题标题】:Java Unit Testing - constant fields versus setUp()Java 单元测试 - 常量字段与 setUp()
【发布时间】:2012-05-10 14:18:51
【问题描述】:

我正在为接口的实现编写一个测试类,并希望针对另一个实现测试我的实现(即确保一致性)。然后测试方法将测试每个接口方法以检查这一点。

为此,我可以:

a) 创建原始实现和我的新实现的private static 常量字段:

public class MyImplTest extends TestCase {

  private static OldImpl _original;
  private static MyImpl _myImpl;
  static {
    // instantiate _original and _myImpl
  }

  // My tests
}

b) 创建两个实现的private 字段,并使用setUp() 实例化它们:

public class MyImplTest extends TestCase {
  private OldImpl _original;
  private MyImpl _myImpl;

  public void setUp(){
    // instantiate _original and _myImpl
  }

  // My tests
}

这些都是首选/被认为是好的风格吗?我的直觉建议 (b),但我想创建相当大的对象,并且 setUp()TestCase 中的每个 testSomething() 方法运行,因此 _original_myImpl 将被创建多次。

FWIW,我正在使用 JUnit 3。

【问题讨论】:

  • 对于未来的读者,这个SO question 也可能会有所帮助。

标签: java unit-testing junit


【解决方案1】:

使用 setup 方法将导致初始化代码在每次测试之前运行。静态初始化器将在类首次加载时运行一次(并且仅一次),这意味着它们在每次测试运行时只会执行一次。

为每个测试重新初始化所有内容通常是一个更好的主意,只是为了消除一个测试中任何对象的状态影响其他测试的能力。

我唯一一次发现使用静态初始化很有用是在我编写集成(而不是单元)测试时,而我的测试类的构建成本很高。我确信该对象是无状态的,因此测试不会相互干扰。如果不确定,最好使用 setup() 方法以确保安全。

【讨论】:

  • 谢谢 - 这是一个很好的观点,但就我而言,OldImpl 和 MyImpl 都是不可变的
  • @JesseWebb:哈哈哈——我正要提交正是那个答案,但你打败了我。几率是多少? (P.S.好久不见!)
  • 另外请注意,如果您的设置相对简单(例如仅构造一个对象),您可以只内联实例化字段,并跳过设置方法的仪式。
  • 另外——“静态初始化只会在测试类运行所有测试之前运行”的想法来自哪里?我不认为是这种情况......
  • @amaidment - 如果您的对象初始化成本很高并且它们是不可变的,您可以使用静态初始化,但在大多数情况下,最好使用 setup() 方法。
猜你喜欢
  • 1970-01-01
  • 2013-01-05
  • 2012-01-13
  • 1970-01-01
  • 2013-05-31
  • 2016-10-25
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
相关资源
最近更新 更多