我正在编写一个解析某些文件而不是处理这些文件的程序。解析器经过了很好的测试,但我也必须测试处理部分。 问题是单元测试函数我需要来自解析器的大对象。我不想手动创建对象(这是太多的时间)。 我的目标是重构一些进程函数,因为某些函数做了很多事情并使用大对象。
语言是java,我使用JUnit。
我试图在单元测试中保存对象并加载,但这是唯一的方法吗? 有什么建议吗?
提前致谢, 彼得
答案 0 :(得分:1)
您可以尝试mock the parsed objects,仅为处理代码调用的特定方法定义所需的返回值。如果对象创建很复杂和/或对象有许多外部依赖项,这将非常有用。
您列出的其他选项是:直接从文件加载已解析的对象,或在单元测试中手动创建它们。我通常更喜欢后一种选择,因为单元测试应尽可能自包含。请注意,手动创建可能很繁琐,但您只需编写一次该代码,然后您可以使用不同的参数重复所有单元测试。使用基于文件的方法时,您需要创建大量文件,这些文件可能在各种小位上有所不同,并且很快就会成为维护问题。例如。如果文件格式在下一个版本中发生了变化怎么办?您需要手动编辑所有测试文件。使用第一种方法时,您只需要在一个地方修改测试设置代码。
答案 1 :(得分:1)
这向我建议您需要简化用于创建这些对象的API。您可以尝试使用Builder设计模式。 The Builder design pattern is useful when you need to do many things to create an object。而不是解析器创建“大对象”,让它委托给Concrete Builder对象,后者为它创建对象。您可以使用Test Spy Builder测试解析器。您对“处理器”部件的单元测试可以使用相同的Concrete Builder来简化(抽象)对象的创建。如果它仍然太复杂,请考虑使用Facade设计模式:在Concrete Builder之上层叠另一个API以简化对象的创建。
这表明您的单元测试方法是错误的。尝试一种渐进的方法,从非常简单的小案例开始。
答案 2 :(得分:0)
如果没有进一步的详细信息并了解代码的性质,很难向您提供建议,但您应该阅读test doubles sections in xUnit patterns book以了解最适合您的内容。
答案 3 :(得分:0)
两个可行的选择:
如果第二个选项似乎更合适,那么您可能会遇到错误或不稳定的API。但有时这是一个真实的陈述并不意味着它很快就会成为一个虚假的陈述。