Вот что я хочу сделать:
def mockSubdirs = []
mockSubdirs << Mock( File ){
getName() >> 'some subdir'
lastModified() >> 2000
}
...
File mockParentDir = Mock( File ){
getName() >> 'parent dir'
eachDir() >> mockSubdirs.iterator() // ??? NB eachDir is a GDK method
// I tried things along these lines:
// listFiles() >> mockSubdirs
// iterator() >> mockSubdirs.iterator()
}
cut.myDirectory = mockParentDir
Код приложения такой:
def dirNames = []
myDirectory.eachDir{
dirNames << it.name
}
Все вышеперечисленное дает FileNotFoundException
в строке myDirectory.eachDir{
...
позже
Спасибо всем 3 ответчикам за возможные решения этой проблемы. Пример кода Kriegaex мне не подходит, и я не знаю, почему. Однако его предложение взглянуть на исходный код Groovy великолепно. Итак, в NioGroovyMethods.java я обнаружил, что eachDir
вызывает eachFile
, что выглядит так:
public static void eachFile(final Path self, final FileType fileType, @ClosureParams(value = SimpleType.class, options = "java.nio.file.Path") final Closure closure) throws IOException {
//throws FileNotFoundException, IllegalArgumentException {
checkDir(self);
// TODO GroovyDoc doesn't parse this file as our java.g doesn't handle this JDK7 syntax
try (DirectoryStream<Path> stream = Files.newDirectoryStream(self)) {
for (Path path : stream) {
if (fileType == FileType.ANY ||
(fileType != FileType.FILES && Files.isDirectory(path)) ||
(fileType != FileType.DIRECTORIES && Files.isRegularFile(path))) {
closure.call(path);
}
}
}
}
... поэтому моей первой мыслью было попытаться издеваться над Files.newDirectoryStream
. Files
равно final
, поэтому вам нужно использовать GroovyMock
, а поскольку метод static
, вам придется использовать что-то вроде этого:
GroovyMock( Files, global: true )
Files.newDirectoryStream(_) >> Mock( DirectoryStream ){
iterator() >> mockPaths.iterator()
}
... попытки в этом направлении, похоже, не работают ... Я бы совсем не удивился, если бы услышал от кого-то, что класс Files
в языковом механизме Groovy не будет затронут этой попыткой имитации...
Затем я подумал, что, предположительно, toPath
должен вызываться для рассматриваемого File
, поэтому попробовал следующее:
File mockParentDir = Mock( File ){
toPath() >> {
println "toPath called"
Mock( Path )
}
}
... эта строка не печатается. Хорошо, я немного в тупике: чтобы получить Path
из File
, я даю ему, что механизм Groovy должен использовать что-то скрытое: может быть, что-то вроде getAbsolutePath()
... а затем создавать Path
из полученного String
? Это потребует дополнительного изучения исходного кода... но если это так, вы не сможете заставить Groovy использовать фиктивный Path
! или... может здесь в игру вступают другие загадочные штучки Groovy: метакласс и т.д.?