2014-01-17 48 views
1

我是TDD新手,遇到问题。据我所知,在生产代码准备就绪之前,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值,但是我想知道在这种情况下如何处理基元?也许我的测试是错误的?

+0

相关:http://programmers.stackexchange.com/questions/224365/in-tdd-is-it-bad-practice-to-pass-a-test-with-code-that-would-pass-more - 对 - 在我看来,这样一个小事件不是问题 – assylias

回答

3

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

+1

我知道这不是真正的问题而是学术讨论,但是当我将返回值更改为-1时,是否意味着我开始编写产品代码?因为首先我应该写一个测试.. – woytech

+1

我不知道学术答案,我只处理真正的问题! ;-) – assylias

+0

@woytech或者像其他人提出的那样:'抛出新的UnsupportedOperationException();' – assylias

0

而不是返回默认值(原语或不原语),你可以抛出一个异常(例如NotImplementedException)。那样,你的测试总是会失败。

1

实际上,当你先写测试时,不应该定义一个类或属性。这意味着应用程序无法编译,因为测试失败。然后你只是不要将初始值分配给这些字段,并且测试将再次失败。

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

+0

关于你的PS我同意这样一个简单的例子,但如果类变得不那么简单,那么测试默认值是0(即,如果使用默认构造函数,变量不会被初始化)是可以的。 – assylias