【问题标题】:Is there something wrong with these unit tests?这些单元测试有问题吗?
【发布时间】:2017-11-27 17:29:13
【问题描述】:

我正在阅读 Martin Fowler (Mocks Aren't Stubs) 的文章,开头有这个 Java 测试:

public class OrderStateTester extends TestCase {
  private static String TALISKER = "Talisker";
  private static String HIGHLAND_PARK = "Highland Park";
  private Warehouse warehouse = new WarehouseImpl();

  protected void setUp() throws Exception {
    warehouse.add(TALISKER, 50);
    warehouse.add(HIGHLAND_PARK, 25);
  }
  public void testOrderIsFilledIfEnoughInWarehouse() {
    Order order = new Order(TALISKER, 50);
    order.fill(warehouse);
    assertTrue(order.isFilled());
    assertEquals(0, warehouse.getInventory(TALISKER));
  }
  public void testOrderDoesNotRemoveIfNotEnough() {
    Order order = new Order(TALISKER, 51);
    order.fill(warehouse);
    assertFalse(order.isFilled());
    assertEquals(50, warehouse.getInventory(TALISKER));
  }

我对这段代码的理解是,在开头(setUp())创建了一个WarehouseImpl,并在两个测试中使用,这两个测试都操作WarehouseImpl对象。因此,测试会相互影响,并且它们的运行顺序可能会影响结果。

我错过了什么吗?

【问题讨论】:

  • 提示:转向 Junit4。 Junit3 和扩展测试用例;这几乎就像上个千年一样。

标签: java unit-testing tdd xunit stub


【解决方案1】:

没有。每个测试都独立于其他测试。因为 junit 将为每个 @Test 方法创建一个全新的实例。因此它们不会影响每个测试的结果,除非测试访问 静态 字段。

【讨论】:

  • 我认为您的答案并不完全正确;它有不止一个问题。
  • @GhostCat 嗨,我不是说使用junit4的OP,我只是使用注释使test与测试类区分开来。
  • 您正在使用仅适用于 JUnit4 的注释;在回答使用 JUnit3 的问题时。再说一遍:你把两个没有意义的东西放在一起。你至少应该把它说得更清楚!
  • @GhostCat 先生,这很重要吗?我仅将其用于区分目的。
  • 显然我发现它很重要,可以告诉你。写不完整、误导性的答案有什么意义!?
猜你喜欢
  • 1970-01-01
  • 2019-01-30
  • 2012-12-01
  • 2019-11-03
  • 2021-12-20
  • 2018-03-13
  • 2011-03-12
  • 2016-08-23
  • 1970-01-01
相关资源
最近更新 更多