当前位置: 首页 > 知识库问答 >
问题:

如何模拟扫描仪和文件类

充浩波
2023-03-14

这就是我想测试的方法

  public void sendMailWitchChanges(JobEntity job, DirectoryEntity directory, FileIdFilePathFileContentEntity fileByPath, LocalDateTime date, String fileName) throws IOException, MessagingException {
    String fileAfterChange = new Scanner(new File(directory.getDirectory() + fileByPath.getFileName())).useDelimiter("\\Z").next();


    fileIdFilePathFileContentEntityRepository.setNewFileContent(fileByPath.getFileId(), fileAfterChange);
    String newContent = StringUtils.difference(fileByPath.getFileContent(), fileAfterChange);
//irrelevant code
}

我的测试:

@Test
void sendMailWitchChanges() throws MessagingException, IOException {
    File fileMock = Mockito.mock(File.class);
    Scanner scannerMock = Mockito.mock(Scanner.class);
    when(new Scanner(any(File.class))).thenReturn(scannerMock);
    when(scannerMock.useDelimiter(anyString()).next()).thenReturn("afterChanges");
    LocalDateTime now = LocalDateTime.now();
    UserEntity user = new UserEntity();
    JobEntity job = new JobEntity("uuid", now, 1, Set.of(user));
    DirectoryEntity directory = new DirectoryEntity(1, "directory");
    FileIdFilePathFileContentEntity fileIdFilePathFileContentEntity = new FileIdFilePathFileContentEntity(1, "fileName", "fileContent");
    mailService.sendMailWitchChanges(job, directory, fileIdFilePathFileContentEntity, now, "fileName"):Mockito.verify(mailService, verificationData -> times(1)).sendMailWitchChanges(job, directory, fileIdFilePathFileContentEntity, now, "fileName");
}

但是我在when(新的扫描器(any(File.class))上得到了NullPointerException)。然后返回(scannerMock)

这个测试应该是什么样的?


共有1个答案

和光启
2023-03-14

静态方法和构造函数在最好的情况下是很难模仿的,在最坏的情况下是不可能模仿的。然而,有了一些智能的代码结构和一组健康的/有文档记录的假设,人们可以对他们的代码进行单元测试,并确保它能完成您需要的任务。

我认为你的主要问题是你的函数签名不适合测试。你应该试着想想:我需要测试我的代码,而不是JDK的代码。

public void sendMailWitchChanges(JobEntity job, DirectoryEntity directory, FileIdFilePathFileContentEntity fileByPath, LocalDateTime date, String fileName) throws IOException, MessagingException {

如果我正在进行代码审查,我会发现文件和目录可能是重叠的,并表明潜在的结构问题。我会找到一种方法来消除这两个变量。如果我成功地做到了这一点,我可以取消对JDK代码(扫描仪、文件等)的测试,并更加专注于测试我的代码。

在这个特定的情况下,通过输入流来传递内容可能会消除对所有这些模拟的需要。在单元测试期间,可以使用ByteArrayInputStream来测试您的代码,并在集成测试期间为更复杂的场景提供灵活性。

 类似资料:
  • 问题内容: 我正在玩Scanner类,以进行学习,并且我使用它来读取非常大的文件(大约60.000行,大约不使用Reader类),并且在大约400行后停止读取。我是否必须在Scanner的构造函数中使用Bufferedreader还是问题?我想知道为什么会这样。谢谢。我的代码是输出所有行的常用代码。 问题答案: 此问题通常在64位计算机上或文件大小大于1-2 GB的文件中更常见,并且与堆空间无关。

  • 我想读取一个文本文件,并将每一行放入一个字符串(字符串数组)。然而,这需要扫描文件两次,一次是为了找出有多少行,另一次是为了创建一个这样大小的字符串数组。但它抛出了一个错误,重置方法似乎不起作用。 这是相关的代码片段。

  • 我需要在一种方法中将文件名作为扫描仪的输入,并在所有其他方法中将该扫描仪用作其余代码的文件路径的引用。 我正在学习文件I/o,对于这个项目,我应该以文件名作为输入,计算文件中的行数,并将每行放入一个数组中。 我的问题出现在FileUtils期间。countRecords方法。在FileUtils中返回文件类型后。打开输入文件(openInputFile),然后将数据放入扫描仪(代码中的变量inf和

  • 我是java新手,我的任务是使用扫描器读取数组,并在另一种方法中读取int。 我正在做的是计算一只兔子到达河对岸所需的最小跳跃次数。数组中的int表示从河的一边开始的石头的距离,另一个int表示石头的数量。兔子能跳的最远距离是50。 对于输入和输出: 输入n:7(输入,河中的石头数)32 46 70 85 96 123 145(输入,石头与起点之间的距离,最后一个数字是河的宽度,即目的地(河对岸)

  • 问题内容: 我的Java作业有问题。我遇到了意外的异常,特别是: java.util.NoSuchElementException:找不到行 我正在使用,该程序不断读取任何内容,并重复“无效格式”异常文本。如果输入正确的值,则第一部分通过,然后该部分立即进入此异常。如果输入的值不正确,则它将开始循环异常。 这是我的代码: 问题答案: 您关闭了多个库,这些库关闭了底层库,因此另一个库将不再从同一库和

  • 问题内容: 使用Scanner类中的useDelimiter时遇到一些问题。 如果我有这个输入 美国广播公司 输出将是 AB 然后等到我键入另一个“-”以打印出最后一个字符 但是,如果我没有用户输入数据,而是将字符串插入到Scanner中,则代码将起作用。原因是什么?如何解决?我不想使用StringTokenzier 问题答案: 如果没有等待您输入另一个,则将错误地假定您已完成输入。 我的意思是,