it-swarm.com.ru

Существуют ли фреймворки Fake File System для Java?

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

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

Похоже, что Ruby ребята сделали это снова, и именно в Ruby я и просил: http://ozmm.org/posts/fakefs.html .

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

80
devoured elysium

Google имеет открытую реализацию в FileSystemProvider Java 7 в памяти. проект называется jimfs .


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

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

49
Michael Deardeuff

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

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


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

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

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

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

35
Stephen C

Вы можете использовать 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");
12
thomas.mc.work

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

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

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

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

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

6
pron

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

4
Paŭlo Ebermann

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

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

4
Deano

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

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

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

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

2
WickyNilliams

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

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

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

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

memoryfilesystem

ephemeralfs

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

1
mostly alien

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

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

0
Andrey Rodionov