如何测试使用模拟 File 对象创建目录的私有方法?

问题描述 投票:0回答:1

我正在尝试测试使用 File 类创建目录的私有方法。但是,当我尝试模拟 File 对象以模拟其行为时,不会使用模拟,因为该方法在内部创建了 File 的新实例。有没有一种方法可以在不修改类的情况下有效测试这个私有方法,确保调用 mkdirs() 时实际使用了该模拟?

private boolean directoryInitializer() {
  File directory = new File(Paths.get("some/path").toString());
  if (!directory.exists()) {
    return directory.mkdirs();
  }
  return true;
}

我不能只测试调用它的方法,因为它是 构造函数

这是我尝试过的:

@Test
@DisplayName("Should create the directory if it does not exist")
void testDirectorynInitializerCreatesDirectory() throws Exception {
  // GIVEN a new ClassToTest is created
  File mockDir = mock(File.class);
  when(mockDir.exists()).thenReturn(false); 
  when(mockDir.mkdirs()).thenReturn(true); 

  // WHEN
  Method directoryInitializer= ClassToTest.class.getDeclaredMethod("directoryInitializer");
  directoryInitializer.setAccessible(true);
  boolean result = (boolean) directoryInitializer.invoke(highScoreManager);
  // THEN
  assertTrue(result, "The directory should be created successfully");
  verify(mockDir).mkdirs();
}

如果相关,请注意在测试类中使用

@TempDir Path tempDir
模拟了路径。

assertTrue(result, "The directory should be created successfully");
工作正常,但是
verify(mockDir).mkdirs();
表明从未使用过mockDir文件(我真的想知道是否有一种方法可以使用它而不是在directoryInitializer中创建的文件)。

spring-boot unit-testing mockito
1个回答
0
投票

添加构造函数重载,以便可以注入工厂(以 lambda 或类的形式)并用工厂替换对 new File 的硬编码调用

© www.soinside.com 2019 - 2024. All rights reserved.