java - 使用 Junit 进行文件操作

标签 java junit

在我的程序中,每当我创建/更新/删除我的对象时,我都会创建文件以将信息发送到现有的 FTP 服务器。为此,我创建了一个文件夹 INFO_FOLDER,我可以创建这些文件并将其发送到服务器。

另一方面,在运行单元测试时,文件会创建到同一文件夹中。这不太好,因为那里可能有真正的程序相关文件,并且我不想将其与测试相关文件混合在一起。

我需要通过 @After 方法删除每个测试中创建的每个文件,或者我需要使用不同的文件夹进行单元测试。不知道第二种是否可行。

我该如何处理这个问题?哪种方式更优雅?或者这个问题还有其他众所周知的解决方案吗?

最佳答案

因此,如果您对代码进行单元测试,则不应处理 I/O,因为文件系统是外部资源,并且您应该使用测试替身(模拟)。单元测试就是单独测试单个事物。

如果您的方法只是输出到 FS,那么您可以验证是否使用 Mockito.verify 调用了特定的 write 方法。 。最好编写集成测试来检查组件是否正确集成在一起(即您的代码与 FS)。例如,

生产代码:

  public void writeToOutput(String path) {
    FS.writeOutput(path);
  }

测试代码:

@Test
  public void writes_to_output() {
    String path = "./sample.txt";
    FS fs = mock(FS.class);           //mock the class that writes to output

    service.writeToOutput(path);      //do the action

    verify(fs).writeOutput(path);     //verify that your FS class called writeToOutput with the given argument
  }

但是,如果您想进行集成测试并检查文件是否写入 FS,那么您应该将输出重定向到不同的位置(如果您的路径硬编码在生产代码上,则不可能重定向它在其他地方),在你的测试目录中。

您永远不应该运行会扰乱生产代码(src 文件夹)的测试

关于java - 使用 Junit 进行文件操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60845261/

相关文章:

java - 使用匹配器断言 Collection 包含 2 个具有相同属性的对象

java - 有时,确实会创建唯一 id 的消费者组,并且消费者会在没有分区的情况下卡住

java - 如何记录 gRPC 客户端与服务器的连接?

java - 考虑在您的配置中定义类型为 'com.ensat.services.ProductService' 的 bean

java - 如何通过 servlet 获取我的自定义 XML 文件

java - 仅当另一个测试通过时,我如何才能运行测试类?

java - 是否可以计算 Javacv 或 opencv 中特定行的宽度?

java - Junit 测试在我的异步线程上挂起

android - 为什么在内联创建mockito模拟时我会看到性能提升?

serialization - 使用 jackson 序列化 Map.Entry 时出现问题