Существуют ли фреймворки фальшивой файловой системы для Java?

Я вводил тесты в проект, который сильно использует операции ввода-вывода (в этом случае файловая система). Система постоянно открывает/закрывает файлы, проверяет, существуют ли файлы, удаляет их и т.д.

Вскоре стало очевидно, что обычное издевательство не будет иметь большого смысла, так как это затруднит мои тесты и объяснит. С другой стороны, наличие поддельной файловой системы было бы потрясающе, и я думаю, довольно легко настроить.

Кажется, рубины ребята сделали это снова, и именно то, что я прошу в ruby: http://ozmm.org/posts/fakefs.html.

Есть ли что-нибудь отдаленно похожее на Java?

Ответ 1

У Google есть открытая реализация Java 7 FileSystemProvider в оперативной памяти. Проект называется jimfs.


Если вы используете Java 6 или более раннюю версию, есть альтернатива: раньше я пользовался Apache Commons VFS с большим успехом. Похоже, что это очень похоже на пользовательский FileSystemProvider, упомянутый другим ответчиком в Java 7.

Он предварительно загружен несколькими реализациями файловой системы: File, RAM, S/FTP и Jar. Я также видел плагин для S3.

Ответ 2

В Java 6 и более ранних версиях это сложно, потому что такие классы, как File и FileInputStream, не позволяют отправлять в разные виртуальные файловые системы в пространстве Java.

В Java 7 поддерживается поддержка виртуальных файловых систем; см. Разработка пользовательского поставщика файловой системы. Я не знаю, позволит ли это вам делать то, что вы хотите сделать, но это хорошее место для поиска.


Мех. Быть тем фактом, что на самом деле нет какой-либо поддельной файловой системы, я предполагаю, что я просто реализую минимальную реализацию самостоятельно. Я ничего не выиграю, используя FileSystemProvider

На самом деле, вы выигрываете с помощью FileSystemProvider:

  • Вы реализуете то, что (если оно выпущено под лицензией с открытым исходным кодом) может быть очень полезным для других людей в вашей позиции и для других целей.

  • Вы упростите себя, если решите переключиться на FileSystemProvider, с которым сейчас может работать кто-то другой.

Ответ 3

Вы можете использовать org.junit.rules.TemporaryFolder из пакета JUnit:

Правило TemporaryFolder позволяет создавать файлы и папки, которые гарантированно будут удалены при завершении метода тестирования (независимо от того, проходит он или не работает):

Пример:

final TemporaryFolder testFolder = new TemporaryFolder();
testFolder.create();
final Path filePath = testFolder.newFile("input.txt").toPath();
final Path dirPath = testFolder.newFolder("subfolder").toPath();

Альтернативно выйдите из части .toPath():

final File filePath = testFolder.newFile("input.txt");

Ответ 4

Вы можете абстрагировать использование File, используя намерение "куда-то записать данные", изменив свой API на использование OutputStream вместо File, затем передать API FileOutputStream в производственном коде, но передать его ByteArrayOutputStream из ваших тестов., ByteArrayOutputStream - это поток в памяти, поэтому он очень быстрый, и вы можете просто проверить его содержимое с помощью его методов - он идеально подходит для тестирования. Там также соответствующий ByteArrayInputStream если вы хотите прочитать данные.

Файловые системы, как правило, довольно быстрые - если бы вы не выполняли много файлового ввода-вывода в своих тестах, я бы не стал беспокоиться.

Обратите внимание, что создание объекта File Java не создает файл на диске, то есть следующий код не вызывает никаких изменений на диске:

File f = new File("somepath"); // doesn't create a file on disk

Ответ 5

Jimfs от Google - это файловая система NIO с памятью, которая отлично подходит для тестов.

Ответ 6

Простым способом было бы использовать ваш системный способ предоставления файловой системы, полностью основанной на ОЗУ, - tempfs в Linux, a RAM-диск в Windows.

Ответ 7

MockFTPServer, похоже, имеет несколько реализаций Fake Fileystem (Unix/Windows)

Похоже, вы можете использовать эти поддельные реализации файловой системы совершенно отдельно от любых концепций FTP. Я пытаюсь сделать это сейчас точно так же, как вы описали.

Ответ 8

Я не уверен в конкретных фреймворках, но общий подход с точки зрения ООП состоит в том, чтобы написать некоторые абстрактные слои поверх любого кода доступа к файлу (интерфейсы в изобилии!) и, возможно, фасад, чтобы облегчить использование общих операций. то вы просто издеваетесь над одним слоем ниже кода, который вы сейчас тестируете, а затем по существу поддельная файловая система (или, по крайней мере, код, который вы тестируете, не будет знать иначе).

если вы изучите использование фреймворка зависимостей для обработки этого для вас, это облегчит возможность переключения компонентов для поддельной реализации интерфейса. если вы будете следовать шаблонам инверсии управления, передача любых зависимостей в конструктор класса, который вы тестируете, также облегчит тестирование.

public interface IFileSystem {
   IFileHandle Load(string path);
   //etc
}

public class ClassBeingTested {
   public ClassBeingTested(IFileSystem fileSystem) {
      //assign to private field
   }

   public void DoSomethingWithFileSystem() {
       //utilise interface to file system here
       //which you could easily mock for testing purposes
       //by passing a fake implementation to the constructor
   }
}

Надеюсь, что моя java правильная, я долго не писал java, но вы, надеюсь, получите дрифт. надеюсь, я не недооцениваю проблему здесь и чрезмерно упрощен!

Конечно, все это предполагает, что вы имеете в виду истинное модульное тестирование, то есть тестирование наименьших возможных единиц кода, а не всей системы. для тестирования интеграции необходим другой подход.

Ответ 9

ShrinkWrap из проекта Arquillian предполагает включение NIO-совместимого в память FileSystem

Вы можете создать простую в памяти FileSystem, выполнив следующие действия:

FileSystem fs = ShrinkWrapFileSystems.newFileSystem(ShrinkWrap.create(GenericArchive.class))

Ответ 10

Две другие в файловых системах памяти для java:

memoryfilesystem

ephemeralfs

Оба реализуют файловую систему NIO.2.

Ответ 11

Я гуглил "Поддельная java FileSystem" и нашел этот вопрос. К сожалению это все, что я нашел. Поэтому я сам написал эту фальшивую файловую систему: https://github.com/dernasherbrezon/mockfs

Я использую его для имитации IOException во время чтения/записи в файлы. IOException может произойти, например, из-за "отсутствия места на диске", которое практически невозможно смоделировать другими средствами.

Ответ 12

Немного старый, и это решение похоже на Linux, но оно выглядит хорошо https://www.google.co.il/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=tmpfs%20on%20ubuntu

tmpfs - это сопоставленная в памяти папка (данные исчезают при перезагрузке). После установки данные могут быть скопированы в него и работать с памятью.