Я представляю тесты в проекте, который интенсивно использует операции ввода-вывода (в данном случае файловую систему). Система постоянно открывает / закрывает файлы, проверяет наличие файлов, удаляет их и так далее.
Вскоре стало очевидно, что регулярные насмешки бесполезны, поскольку это затруднит настройку моих тестов и их рассуждение. С другой стороны, было бы здорово иметь поддельную файловую систему, и я думаю, ее довольно легко настроить.
Кажется, ребята с рубином сделали это снова, и это именно то, что я прошу в рубине: http://ozmm.org/posts/fakefs.html .
Есть ли что-нибудь отдаленно похожее на Java?
java
unit-testing
testing
mocking
пожрал элизиум
источник
источник
Ответы:
У Google есть реализация в памяти Java 7 FileSystemProvider с открытым исходным кодом. Проект называется jimfs .
Если вы используете Java 6 или более раннюю версию, есть альтернатива: раньше я с большим успехом использовал Apache Commons VFS . Похоже, что это очень похоже на настраиваемый FileSystemProvider, упомянутый другим ответчиком в Java 7.
Он поставляется с предварительно загруженными реализациями нескольких файловых систем: File, RAM, S / FTP и Jar, чтобы назвать несколько. Еще видел плагин для S3 .
источник
Path
случайно)В Java 6 и более ранних версиях это сложно, потому что классы любят
File
и неFileInputStream
предоставляют возможности для отправки в разные «виртуальные файловые системы» в пространстве Java.В Java 7 есть поддержка виртуальных файловых систем; см. « Разработка настраиваемого поставщика файловой системы» . Не знаю, позволит ли это вам делать то, что вы хотите, но это хорошее место для начала поиска.
На самом деле, вы ДЕЙСТВИТЕЛЬНО выигрываете, используя FileSystemProvider:
Вы реализуете что-то, что (если выпущено под лицензией с открытым исходным кодом) может быть очень полезно для других людей в вашем положении и для других целей.
Вы упростите себе задачу, если решите переключиться на FileSystemProvider, над которым прямо сейчас может работать кто-то другой.
источник
Вы можете использовать
org.junit.rules.TemporaryFolder
из пакета JUnit :Пример:
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");
источник
Вы можете абстрагироваться от использования
File
, используя намерение «где-то записывать данные», изменив свой API, чтобы использоватьOutputStream
вместо aFile
, затем передать API aFileOutputStream
в производственном коде, но передать егоByteArrayOutputStream
из ваших тестов. AByteArrayOutputStream
- это поток в памяти, поэтому он очень быстрый, и вы можете просто проверить его содержимое с помощью его методов - он идеально подходит для тестирования. Также есть соответствующий,ByteArrayInputStream
если вы хотите читать данные.Файловые системы, как правило, довольно быстрые - я бы не стал беспокоиться, если в ваших тестах не было много операций ввода-вывода файлов.
Обратите внимание, что создание
File
объекта java не создает файл на диске, то есть следующий код не вызывает никаких изменений на диске:File f = new File("somepath"); // doesn't create a file on disk
источник
new File("xyz").getAbsolutePath()
не делает абсолютно ничего бы то ни было , за исключением возвращает путь , что файл будет иметь , если он существовал. Это не меняет файловую систему; если файл не существует, он по-прежнему возвращает строку пути и не создает файл. Что вы имели в виду под «посмотрим, что произойдет»?File
не является окончательным в моем OpenJDK 7.Jimfs от Google - это файловая система NIO в памяти, которая отлично подходит для тестов.
источник
Простым способом было бы использовать способ предоставления вашей системы файловой системы, полностью основанной на ОЗУ - tempfs в Linux, RAM-диск в Windows.
источник
MockFTPServer, похоже, имеет несколько реализаций Fake Filesystem (Unix / Windows)
Похоже, вы можете использовать эти поддельные реализации файловой системы отдельно от любых концепций FTP. Я пробую это сейчас для тех же целей, что вы обрисовали.
источник
Я не уверен в конкретных фреймворках, но общий подход с точки зрения ООП заключался бы в написании некоторых абстрактных слоев поверх любого кода доступа к файлам (интерфейсов в изобилии!) и, возможно, фасада для облегчения использования общих операций. тогда вы просто имитируете один уровень ниже кода, который вы сейчас тестируете, и тогда это, по сути, поддельная файловая система (или, по крайней мере, код, который вы тестируете, иначе не узнает).
если вы рассмотрите возможность использования инфраструктуры внедрения зависимостей, чтобы справиться с этим за вас, это упростит возможность отключать компоненты для поддельной реализации интерфейса. Если вы следуете шаблонам инверсии управления, передавая любые зависимости в конструктор класса, который вы тестируете, это также упростит тестирование.
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, но, надеюсь, вы поймете дрейф. надеюсь, я не недооцениваю проблему и не слишком упрощаюсь!
конечно, все это предполагает, что вы имеете в виду истинное модульное тестирование, то есть тестирование минимально возможных единиц кода, а не всей системы. для интеграционного тестирования нужен другой подход.
источник
ShrinkWrap из проекта Arquillian, похоже, включает NIO-совместимую файловую систему памяти
Вы можете создать простую файловую систему в памяти, выполнив следующие действия:
источник
Две другие файловые системы в памяти для java:
память файловая система
эфемерные
Оба реализуют API файловой системы NIO.2.
источник
Я искал "Поддельная файловая система Java" и нашел этот вопрос. К сожалению, это все, что я нашел. Я сам написал эту фальшивую файловую систему: https://github.com/dernasherbrezon/mockfs
Я использую его для имитации IOExceptions во время чтения / записи в файлы. IOException может произойти, например, из-за «отсутствия места на диске», что практически невозможно смоделировать другими способами.
источник
Это немного устарело, и это решение похоже только на Linux, но выглядит хорошо https://www.google.co.il/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=tmpfs%20on% 20ubuntu
tmpfs - это отображаемый каталог в памяти (данные исчезают при перезагрузке). После подключения данные могут быть скопированы в него и работать с ними из памяти.
источник