File
в Java очень громоздко для тестирования.Не существует простого способа создания какой-либо виртуальной абстракции файловой системы, которую можно использовать для тестов.
Крутой способ обойти это - создать какую-то оболочку, которую можно использовать для создания заглушек и насмешек.
Например:
trait FileOps { //trait which works as proxy for file
def getName(): String
def exists(): Boolean
}
object FileOps {
class FileOpsImpl(file: File) extends FileOps {
override def getName(): String = file.getName //delegate all methods you need
override def exists(): Boolean = file.exists()
}
implicit class FromFile(file: File) { //implicit method to convert File to FileOps
def toFileOps: FileOpsImpl = new FileOpsImpl(file)
}
}
Тогда вам придется использовать его вместо File
в вашем классе:
class UsesDirectory(directory : FileOps) {
...
}
//maybe you can even create implicit conversion, but it's better to do it explicitly
val directory = new UserDirectory(file.toFileOps)
И в чем выгода?
В своих тестах вы можете предоставить пользовательскую реализацию FileOps
:
class UsesDirectorySpec extends FlatSpec {
val dummyFileOps = new FileOps {
override def getName(): String = "mock"
override def exists(): Boolean = true
}
//OR
val mockFileOps = mock[FileOps] //you can mock it easily since it's only trait
val usesDirectory = UsesDirectory(dummyFileOps)
"UsesDirectory" should {
...
}
}
Если вы используете этот или аналогичный подход, вам даже не нужно трогать файловую систему в модульном тесте.