2010-11-01 125 views
2

我有一个DeliveryScheduleParser类,它读入电子表格并将其解析为多个对象,这些对象最终都会在DeliveryScheduleParser类中的getClient()方法返回的客户端对象中结束。如何对电子表格解析器进行单元测试?

public class DeliveryScheduleParser { 

    private final HashMap<String, Integer> _headerColumnNumbers; 
    private final File _file; 
    private HSSFSheet sheet; 
    private Client client; 

    public DeliveryScheduleParser(File file) { 
     this._file = file; 
     sheet = getSheet(_file); 
     _headerColumnNumbers = getHeaderMap(sheet); 
     parseSheet(); 
    } 

    public Client getClient(){ 
     return client; 
    } 

    // Other private methods here 
} 

这个类里面的parseSheet()方法基本上完成了所有的工作,只要求一些静态消毒方法,这些方法分别进行单元测试。

我的问题基本上是确保客户端对象正确填充正确对象的最佳方法,并且这些对象反过来也填充了正确的对象(嵌套了很多ArrayLists在其他ArrayLists内)。

我还想针对不同数据的电子表格运行单元测试,以确保所有解析都是正确的。

回答

0

我猜这个场景是由两套测试组成的。

  1. 您必须有一个名为Client的接口。你应该嘲笑它,看看你的DeliveryScheduleParser是否正确地与它交互。所以首先嘲笑你的客户并测试你的DeliveryScheduleParser。
  2. 现在从客户端定义你的期望,并逐个写下你的测试。然后实现实现了Client接口的类(如此ClientImpl)。

嘲笑你可能喜欢使用Mockito或任何嘲笑框架,以方便。

因此,基本上为了能够“确保客户端对象正确填充正确的对象”,您必须测试您的Client,但不是立即测试DeliveryScheduleParser。其实你的DeliveryScheduleParser应该是一个合作者,并与Client互动。

然后你可能想以类似的方式分解这个实现,因为它听起来像这里的对象相当耦合。

对于ArrayList您可能喜欢使用的接口List接口和模拟它。

针对不同电子表格进行测试是一项集成测试。还有,你可以用你可以在每个测试中提供不同的电子表格的方式来模拟你的文件提供者(这里不清楚)。您可以将这些信息表添加到测试文件夹下的资源中,并可以使用reource loader加载测试表。我也会将这些测试与速度的单元测试分开。

我想更具体的,但希望它可以帮助...

0

由于类似乎真正的文件解析成对象世界中,我建议编写集成测试 - 与锻炼你的课堂测试真实的文件。单元测试使用解析器的类型可以依赖角色/接口(并模拟它)。

您还可以将数据驱动/参数检测的等效运行针对不同的输入相同的测试(在这种情况下的文件)

理想解析责任应该驻留在一个类型/类。它应该接受输入并生成另一种类型(数据结构/对象)作为输出。