Java 文件读取和可测试代码
我有一段java代码,它从文件中读取字符串并用字符串创建映射。由于这段代码依赖于一个文件,所以单元测试很笨拙。如何设计这样的片段,使代码可以进行单元测试Java 文件读取和可测试代码,java,unit-testing,Java,Unit Testing,我有一段java代码,它从文件中读取字符串并用字符串创建映射。由于这段代码依赖于一个文件,所以单元测试很笨拙。如何设计这样的片段,使代码可以进行单元测试 我能想到的一种方法是,它可以采用输入流,而不是将文件作为参数。在实际场景中,传递文件输入流,而单元测试传递从字符串创建的输入流。但是,在我看来,这是一个过度的杀戮。有更好的方法吗?在这种情况下,我常常为测试用例创建所需的文件,并在单元测试中使用它们。我为这些文件(测试数据)设置了一个专用文件夹,并设置测试用例以获取适合测试用例的文件 在这种情况
我能想到的一种方法是,它可以采用输入流,而不是将文件作为参数。在实际场景中,传递文件输入流,而单元测试传递从字符串创建的输入流。但是,在我看来,这是一个过度的杀戮。有更好的方法吗?在这种情况下,我常常为测试用例创建所需的文件,并在单元测试中使用它们。我为这些文件(测试数据)设置了一个专用文件夹,并设置测试用例以获取适合测试用例的文件 在这种情况下,我常常为测试用例创建所需的文件,并在单元测试中使用它们。我为这些文件(测试数据)设置了一个专用文件夹,并设置测试用例以获取适合测试用例的文件 如果您对文件所做的一切都是读取它,那么不提供从
InputStream
读取的函数就是设计错误。因此,修改函数以获取InputStream
,并提供获取文件的包装器。使用StringInputStream或StringInputStream来测试它是可以的。如果您对文件所做的一切都是读取它,那么不提供从InputStream读取的函数是一个设计错误。因此,修改函数以获取InputStream
,并提供获取文件的包装器。使用或StringInputStream来测试它是可以的。我建议使用专用于测试的数据集(在本例中是文件)。否则,我将使用mocking来模拟对外部资源的访问。
在任何情况下,我都倾向于尽可能扩展自动测试的覆盖范围。我建议使用专用于测试的数据集(在本例中为文件)。否则,我将使用mocking来模拟对外部资源的访问。
在任何情况下,我都倾向于尽可能扩展自动测试的覆盖范围。这样看:无论您如何重新组织代码,测试数据都必须来自某个文件。我看到两种变体:
数据在一个.java单元测试源代码文件中进行了适当编码。它只适用于小的测试数据集。正如您所描述的,您需要重构代码以获取输入流,并使用另一个与文件一起工作的包装器
测试数据文件。你必须创建一个
项目范围的约定在何处保存测试
数据文件。他们的位置可能是
相对于jave项目
位置,或在普通测试下
数据文件根目录。不管怎样,这都有帮助
有一个实用的方法
返回给定“逻辑”文件名的完整测试数据文件路径
在你的情况下(一个测试,一百个单词)第一个解决方案似乎就足够了。是的,您需要稍微重构代码。第二种解决方案更通用,我个人认为它更实用、更适用
有些人会说,如果它可以处理数据文件,那么这不是一个单元测试。好吧,这是一个关于“单元测试”定义的问题,它与此无关。如果您需要测试代码,只需为您的项目找到最佳/最方便的方法。这样看:无论您如何重新组织代码,测试数据都必须来自某个文件。我看到两种变体:
数据在一个.java单元测试源代码文件中进行了适当编码。它只适用于小的测试数据集。正如您所描述的,您需要重构代码以获取输入流,并使用另一个与文件一起工作的包装器
测试数据文件。你必须创建一个
项目范围的约定在何处保存测试
数据文件。他们的位置可能是
相对于jave项目
位置,或在普通测试下
数据文件根目录。不管怎样,这都有帮助
有一个实用的方法
返回给定“逻辑”文件名的完整测试数据文件路径
在你的情况下(一个测试,一百个单词)第一个解决方案似乎就足够了。是的,您需要稍微重构代码。第二种解决方案更通用,我个人认为它更实用、更适用
有些人会说,如果它可以处理数据文件,那么这不是一个单元测试。好吧,这是一个关于“单元测试”定义的问题,它与此无关。如果您需要测试代码,只需为您的项目找到最佳/最方便的方法。3个重要问题:您的测试数据文件有多大?编写一个好的测试用例需要多少不同的测试数据文件?你能轻松地动态生成测试数据吗,还是需要我手动准备。测试数据文件不大。包含大约100个单词。2.只有一个文件足够我测试。3.是的,数据必须手动准备,不能动态生成。3个重要问题:您的测试数据文件有多大?编写一个好的测试用例需要多少不同的测试数据文件?你能轻松地动态生成测试数据吗,还是需要我手动准备。测试数据文件不大。包含大约100个单词。2.只有一个文件足够我测试。3.是的,数据必须手动准备,不能动态生成。是的,我也会创建单独的测试资源文件供我的测试使用。是的,我也会创建单独的测试资源文件供我的测试使用。