【问题标题】:TDD: How to create tests that tests init valueTDD:如何创建测试初始值的测试
【发布时间】:2014-01-17 08:40:15
【问题描述】:

我是 TDD 新手,但遇到了问题。据我所知,TDD 中的所有测试都应该在生产代码准备好之前失败。我开发了以下代码:

汽车界面:

public interface CarOperations{

/**
 * Return current car speed in km/h
 */
public int currentSpeed();

}

汽车类:

public class Car implements CarOperations{

@Override
public int currentSpeed() {
    // TODO Auto-generated method stub
    return 0;
}}

JUnit 测试:

    @Test
public void testInitSpeed() {
    Car car = new Car();

    assertEquals(0, car.currentSpeed());
}

所以我希望这个测试会失败,因为在我开发任何生产代码之前每个 TDD 测试都应该失败,但是由于 int 默认值,这个测试会通过。我可以将方法的返回类型更改为 Integer 并接收 NULL 值,但我想知道在这种情况下如何处理原语?也许我的测试错了?

【问题讨论】:

标签: java unit-testing junit tdd


【解决方案1】:

我不认为这样一个微不足道的情况是一个问题,因为很明显,如果你不返回 0,测试就会失败。如果您确实想确认测试可能会失败,现在可以return -1;

【讨论】:

  • 我知道这是一个学术讨论而不是真正的问题,但是当我将返回值更改为-1时,是否意味着我开始编写生产代码?因为首先我应该写一个测试..
  • 我不知道学术答案,我只处理实际问题! ;-)
  • @woytech 或者按照其他人的建议:throw new UnsupportedOperationException();
【解决方案2】:

实际上,当您首先编写测试时,不应该定义类或属性。这意味着应用程序无法编译,这算作测试失败。然后你根本不为字段分配初始值,测试将再次失败。

P.S:测试类型的默认值(例如 0 代表 int,null 代表 String 等)有点毫无意义。

【讨论】:

  • 关于您的 P.S.我同意这样一个简单的例子,但是如果类变得不那么简单,测试默认值为 0(即,如果使用默认构造函数,则变量不会被初始化)是可以的。
【解决方案3】:

您可以抛出异常(例如NotImplementedException),而不是返回默认值(基元与否)。这样,您的测试将永远失败。

【讨论】:

    猜你喜欢
    • 2021-02-06
    • 2011-05-13
    • 2011-11-16
    • 2015-04-27
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    相关资源
    最近更新 更多