Существуют ли фреймворки Fake File System для Java? - PullRequest
80 голосов
/ 07 августа 2011

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

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

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

Ответы [ 12 ]

49 голосов
/ 29 июня 2012

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


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

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

35 голосов
/ 07 августа 2011

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

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


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

На самом деле вы выигрываете, используя FileSystemProvider:

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

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

12 голосов
/ 07 июля 2014

Вы можете использовать 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() part:

final File filePath = testFolder.newFile("input.txt");
8 голосов
/ 07 августа 2011

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

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

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

File f = new File("somepath"); // doesn't create a file on disk
6 голосов
/ 26 января 2015

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

4 голосов
/ 01 сентября 2011

MockFTPServer , кажется, имеет несколько реализаций поддельной файловой системы (Unix / Windows)

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

4 голосов
/ 07 августа 2011

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

2 голосов
/ 06 сентября 2013

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

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

FileSystem fs = ShrinkWrapFileSystems.newFileSystem(ShrinkWrap.create(GenericArchive.class))
2 голосов
/ 07 августа 2011

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

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

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, но, надеюсь, вы получите дрейф. надеюсь, я не недооцениваю проблему здесь и слишком упрощен!

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

1 голос
/ 06 апреля 2015

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

memoryfilesystem

ephemeralfs

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...