tutorial interfaz gui grafica español ejemplos componentes java unit-testing testing mocking

interfaz - jframe en java



¿Hay marcos de sistema de archivos falsos para Java? (11)

En Java 6 y FileInputStream anteriores, es difícil porque clases como File y FileInputStream no permiten enviar a diferentes "sistemas de archivos virtuales" en el espacio de Java.

En Java 7, hay soporte para sistemas de archivos virtuales; ver Desarrollar un proveedor de sistema de archivos personalizado . No sé si esto te permitirá hacer lo que quieres hacer, pero es un buen lugar para empezar a buscar.

Meh. Siendo el hecho de que no parece haber ningún sistema de archivos falso, supongo que solo implementaré una implementación mínima por mi cuenta. No gano nada usando FileSystemProvider

En realidad, SI ganas usando FileSystemProvider:

  • Implementa algo que (si se publica bajo una licencia de código abierto) podría ser muy útil para otras personas en su posición y para otros fines.

  • Lo hace más fácil para usted si decide cambiar a FileSystemProvider que alguien más podría estar trabajando en este momento.

Estoy introduciendo pruebas en un proyecto que hace un uso intensivo de las operaciones IO (el sistema de archivos, en este caso). El sistema abre / cierra archivos constantemente, comprueba si los archivos existen, los elimina, etcétera.

Pronto se hizo obvio que la burla regular no sería de mucha utilidad, ya que eso haría que mis pruebas fueran difíciles de configurar y razonar. Por otro lado, tener un sistema de archivos falso sería increíble, y creo que es bastante fácil de configurar.

Parece que los chicos Ruby lo hicieron de nuevo, y hay exactamente lo que estoy pidiendo en ruby: http://ozmm.org/posts/fakefs.html .

¿Hay algo remotamente similar para Java?



He utilizado Apache Commons VFS antes de gran éxito. Parece ser muy similar al FileSystemProvider personalizado que otro respondedor mencionado está en Java7.

Viene pre-loaded con varias implementaciones de sistema de archivos: archivo, RAM, S / FTP y Jar, por nombrar algunos. También he visto un complemento para S3 .

Actualización (3 años después)

Google tiene una implementación en código abierto y en memoria del FileSystemProvider de Java 7. El proyecto se llama jimfs .

Esta es una gran victoria si prefiere usar las API estándar sobre las API de Apache.


No estoy seguro de marcos específicos, pero un enfoque general en términos de OOP sería escribir algunas capas abstractas encima de cualquier código de acceso a archivos (¡interfaces en abundancia!) y tal vez una fachada para facilitar el uso de operaciones comunes. entonces solo te burlas de una capa debajo del código que estás probando actualmente y básicamente es un sistema de archivos falso (o al menos el código que estás probando no sabrá lo contrario).

Si considera utilizar un marco de inyección de dependencias para manejar esto, facilitará la capacidad de cambiar los componentes de una implementación falsa de una interfaz. Si sigues los patrones de inversión de control, pasando cualquier dependencia al constructor de la clase que estás probando, esto también facilitará las pruebas.

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 } }

Espero que mi Java sea correcto, no he escrito Java en mucho tiempo, pero espero que entiendas el tema. ¡con suerte no estoy subestimando el problema aquí y siendo demasiado simplista!

por supuesto, esto es todo suponiendo que te refieras a la verdadera prueba unitaria, es decir, probando las unidades de código más pequeñas posibles, y no un sistema completo. para las pruebas de integración se necesita un enfoque diferente.


Otros dos en los sistemas de archivos de memoria para Java son,

memoryfilesystem

ephemeralfs

Ambos implementan la API del sistema de archivos NIO.2.


Puede abstraer el uso de File utilizando la intención de "escribir datos en algún lugar" cambiando su API para usar un OutputStream lugar de un File , luego pasarle a la API un FileOutputStream en su código de producción, pero pasarle un ByteArrayOutputStream de sus pruebas . Un ByteArrayOutputStream es una transmisión en memoria, por lo que es muy rápido y puedes simplemente inspeccionar su contenido utilizando sus métodos; es perfecto para las pruebas. También está el ByteArrayInputStream correspondiente si desea leer datos.

Los sistemas de archivos generalmente son bastante rápidos, a menos que estuvieras haciendo una gran cantidad de File I / O en tus pruebas, no me molestaría.

Tenga en cuenta que la creación de un objeto de File java no crea un archivo en el disco, es decir, el siguiente código no causa ningún cambio en el disco:

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


Puede usar org.junit.rules.TemporaryFolder del paquete JUnit :

La regla TemporaryFolder permite la creación de archivos y carpetas que se garantiza que se eliminarán cuando finalice el método de prueba (ya sea que pase o falle):

Ejemplo:

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

De forma alternativa, salga de la parte .toPath() :

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


Una manera simple sería usar la forma de su sistema de proporcionar un sistema de archivos basado totalmente en RAM: tempfs en Linux, un disco RAM en Windows.


ShrinkWrap del proyecto Arquillian busca incluir un NIO compatible en la memoria FileSystem

Puede crear un archivo simple en la memoria FileSystem haciendo lo siguiente:

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


MockFTPServer parece tener un par de implementaciones de sistema de archivos falso (Unix / Windows)

Parece que puede usar estas implementaciones falsas del sistema de archivos bastante por separado desde cualquier concepto de FTP. Estoy intentando esto ahora exactamente por la misma búsqueda que usted ha descrito.


Jimfs , de Google, es un sistema de archivos NIO en memoria, eso es genial para las pruebas.