如何JUnit测试从文件解析的对象

我正在编写一个解析一些文件而不是处理这些文件的程序。 解析器经过了很好的测试,但我也必须测试处理部分。 问题是unit testing函数我需要来自解析器的大对象。 我不想手动创建对象(这是太多的时间)。 我的目标是重构一些过程函数,因为某些函数做了很多事情并且使用了大量的对象。

语言是java,我使用JUnit。

我试图在unit testing中保存对象并加载,但这是唯一的方法吗? 有什么建议么?

彼得,先谢谢你

您可以尝试模拟已解析的对象 ,仅为处理代码调用的特定方法定义所需的返回值。 如果对象创建很复杂和/或对象具有许多外部依赖性,这将非常有用。

其他选项是您列出的:直接从文件加载已解析的对象,或在unit testing中手动创建它们。 我通常更喜欢后一种选择,因为unit testing应尽可能自包含。 请注意,手动创建可能很繁琐,但您只需编写一次该代码,然后您可以使用不同的参数重复所有unit testing。 使用基于文件的方法时,您需要创建大量文件,这些文件可能在各种小位上有所不同,并且很快就会成为维护问题。 例如,如果文件格式在下一个版本中发生变化怎么办? 您需要手动编辑所有测试文件。 使用第一种方法时,您只需要在一个位置修改测试设置代码。

当你说“大对象”时,你的意思是它们是由许多类的对象组合而成的吗?

这告诉我,您需要简化用于创建这些对象的API。 您可以尝试使用Builder设计模式。 当您需要执行许多操作来创建对象时,Builder设计模式非常有用 。 而不是解析器创建“大对象”,让它委托给Concrete Builder对象,后者为它创建对象。 您可以使用Test Spy Builder测试解析器。 您对“处理器”部件的unit testing可以使用相同的Concrete Builder来简化(抽象)对象的创建。 如果它仍然太复杂,请考虑使用Facade设计模式:在Concrete Builder之上层叠另一个API以简化对象的创建。

当你说“大物件”时,你的意思是它们占据了很多记忆吗?

这表明你的unit testing方法是错误的。 尝试一种增量方法,从非常简单的小案例开始。

如果没有进一步的细节并且知道代码的性质,很难为您提供建议,但您应该阅读xUnit模式书中的测试双打部分,以了解最适合您的内容。

两个可行的选择:

  1. 使用解析器使用的API创建一组或多组对象以执行处理测试
  2. 编写一些简单的测试代码,以解析器读取的格式生成临时文件或内存缓冲区

如果第二个选项似乎更合适,那么您可能会遇到错误或不稳定的API。 但有时这是一个真实的陈述并不意味着它很快就会成为一个虚假的陈述。