我正在尝试测试使用 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中创建的文件)。
添加构造函数重载,以便可以注入工厂(以 lambda 或类的形式)并用工厂替换对 new File 的硬编码调用