我有一段java代码,它从文件中读取字符串并从字符串中创建一个映射。由于此代码依赖于文件,因此单元测试很笨拙。如何设计这样的部件,以便代码可以进行单元测试?
我能想到的一种方法是,将文件作为参数,而不是将此文件作为参数,它可以采用输入流。在实际场景中,传递文件输入流,而单元测试传递从字符串创建的输入流。但是,这看起来像是对我的过度杀戮。还有更好的方法吗?
答案 0 :(得分:4)
设计错误不提供从InputStream
读取的函数,如果您对该文件的所有操作都被读取。因此,修改函数以获取InputStream
,并提供一个File
的包装器。使用ByteArrayInputStream或StringInputStream来测试它很好。
答案 1 :(得分:2)
在这种情况下,我曾经为测试用例创建所需的文件,并在单元测试中使用它们。我有一个专用文件夹来存储这些文件(测试数据)并设置测试用例以获取适合测试用例的文件。
答案 2 :(得分:2)
以这种方式看待:无论您如何重新组织代码,测试数据都必须来自某些文件。我看到了两个变种:
数据在其中一个.java单元测试源代码文件中就地编码。它仅适用于小型测试数据集。如您所述,您需要重构代码以获取输入流并使用另一个与文件一起使用的包装器。
测试数据文件。你必须创建一个 项目范围的约定在哪里保持测试 数据文件。他们的位置可能是 相对于jave项目 地点,或在共同的测试下 数据文件根目录。在任何情况下,它都有帮助 有一个实用的方法 在给定“逻辑”文件名的情况下返回完整的测试数据文件路径。
似乎在你的情况下(只有一个测试,一百个单词)第一个解决方案可能就够了。是的,您需要稍微重构一下代码。第二种解决方案更通用,我个人觉得它更实用,更实用。
有些人会说如果它适用于数据文件,则不是单元测试。嗯,这是“单元测试”的定义问题,而且非常无关紧要。如果您需要测试代码,只需为项目找到最佳/最便捷的方式。
答案 3 :(得分:0)
我建议使用专门用于测试的数据集(在本例中为文件)。否则我会使用模拟来模拟对外部资源的访问。 在任何情况下,我都倾向于尽可能扩展自动测试的覆盖范围。