2013-12-08 22 views
1

让说我的单元测试,返回汽车的数量在我的车库的方法,所以我有这样的方法:我应该在单元测试中做多少对象初始化?

public class Garage { 
    public long numberOfCarsInGarage() { 
     return cars.size(); 
    } 
} 

从测试类:

@Test 
public void numberOfCarsInGarage_returnsCount_whenCarsHaveBeenAddedToTheGarage() { 
    Garage garage = new Garage(); 

    Car firstCar = new Car(); 
    Car secondCar = new Car(); 
    Car thirdCar = new Car(); 

    garage.addCars(firstCar, secondCar, thirdCar); 

    assertEquals(3, garage.numberOfCarsInGarage()); 
} 

每辆车对象有许多属性需要设置,但我不需要设置它们以便测试通过。我是否应该在测试中尽可能少地使用代码来使其通过/失败?在这个测试中,我没有在汽车对象上设置虚拟数据,我没有做错任何事情?

+1

您不需要设置不会导致测试失败的字段。我会尽最大努力通过测试。理想情况下,你会做的最低首先失败,然后添加代码,使其通过。 –

+0

调用'garage.addCars(...);'的已知副作用是什么?这就是你的测试应该涵盖的内容。 –

+0

我同意上述两点意见。我的建议:写下待测试方法的javadoc,并验证在此javadoc中声明的合同是否已完成。如果合同是“返回车库中的汽车总数”,那么它应该测试。如果合同是“返回车库中红色车辆的数量”,那么它应该添加一些红色车辆和一些非红色车辆,并对其进行测试。编写javadoc不仅仅是因为它记录了方法,还因为它让你思考你需要测试什么,边缘情况等。 –

回答

0

对于您所描述的用例,似乎没有设置虚拟数据。这真的取决于该项目。我正在测试每台服务器上涉及5台服务器和多个进程的复杂分布式系统。我的一些测试处理小部分,但一些是整个系统的端到端测试。就我而言,我的大多数测试框架都在设置环境。一般的规则是,你应该设置足够的,以便你的测试可能捕捉失败。每当你发现你的测试用例没有被捕获,因为它没有足够的设置,考虑设置更多的东西,这样测试用例将在未来捕获它。请注意,您正试图平衡涵盖可能出现的问题的测试用例,并使它们足够简单,以便您可以高效地编写它们。

0

如果你正在进行单元测试numberOfCarsInGarage()这意味着你只希望你的测试只有在该方法中的某些内容出错时才会失败,那么你应该尝试将它的调用与类中的其他内容隔离开来。

我建议避免调用addCars(),而不是我会创建一个模拟汽车列表,我会set it in the SUT using reflection

相关问题