2010-06-30 22 views
10

¿Alguien tiene sugerencias para un objeto de archivo java mock? Estoy usando una clase de terceros que necesita obtener un objeto java.io.File como argumento. Recibo los datos de este archivo en una transmisión a través de un servicio web (también uno de sus productos).Sugerencias para un archivo falso de Java (para simular java.io.File)

Una solución es escribir todos estos datos en un archivo y ofrecer esto a la clase. Esta es una solución que no me gusta: le quita la ventaja de usar el servicio web en lugar de simplemente descargar el archivo.

Más rápido y más eficiente sería poner esta información de la memoria en un archivo simulado y ofrecer este archivo simulado a la clase de terceros.

Probablemente tenga que ser un MockFile que amplíe el archivo java.io.File y anule todas las funciones que realmente interactúan con el archivo en el disco duro.

Sé que la tercera parte debería haber utilizado una secuencia como argumento de entrada en lugar de un archivo. Sin embargo, esto está más allá de mi influencia.

+0

Gracias por todas las respuestas ... Me parece que un archivo falso no es la solución. ... lo único que puedo hacer con esto, es crear un objeto File extendido que genere automáticamente un archivo y darle esto a la clase de terceros. Por lo que realmente quería ... la clase de terceros debería tener que aceptar un InputStream como argumento. Pero esto también se puede hacer mediante el uso de la sugerencia sobre el contenedor. Un poco frustrante la clase de tercero solo acepta un archivo. –

+0

¿Ha considerado usar [Commons VFS] (http://commons.apache.org/vfs/)? – mickthompson

+0

Como se indicó anteriormente, este paquete parece ofrecer la solución que estoy buscando ... le permitirá saber si esto es útil. –

Respuesta

5

Esto es sólo una sugerencia basada en mi comprensión de su pregunta. creo, debe estar haciendo algo como esto,

public void doSomething(){ 
     //Pre processing 
     Object result=new ThirdPartyCode().actualMethod(file); 
    //Post processing 
} 

objetos Mock tienen más sentido desde una perspectiva de la unidad de pruebas. Su objetivo no es probar la unidad de la función de la biblioteca de terceros. Si se trata de la unidad de prueba de método DoSomething(). Así que, probablemente, se puede crear una envoltura alrededor de la tercera parte function.Maybe algo como esto,

public class Wrapper implements MyWrapper{ 

    public Object invokeThirdPartyFunction(File file){ 
     new ThirdPartyCode().actualMethod(file); 
    } 
} 

Ahora puede crear un envoltorio de maqueta (la aplicación de la misma interfaz) y el uso de este contenedor simulacro para todas sus casos JUnit.

+0

Gracias, esto en combinación con la respuesta sobre VFS común probablemente sea el truco. (necesita algo como el VFS común para crear un archivo virtual sin crear el archivo en el disco duro) –

+0

Bienvenido y buena suerte. – chedine

2

¿La clase probada solo consulta el nombre, atributos, etc. del archivo falso, o intenta abrir el archivo?

En el primer caso, puede crear fácilmente su simulacro usando, por ejemplo, EasyMock o un marco burlón equivalente.

El último caso es más complicado, y me temo que si el flujo de entrada es creado internamente por la clase, no tiene más remedio que crear realmente un archivo de prueba real en la HD.

+0

Realmente quiere obtener (leer) los datos del archivo. Así que estoy buscando un archivo simulado que las anulaciones también lean ... Y lean de los datos en la memoria (en el archivo de simulacro) Sé que es más complicado, pero espero que algo así lo haya hecho ... –

+0

@ michel, el problema es que 'File' es solo" una representación abstracta de nombres de rutas de archivos y directorios "[(desde el Javadoc)] (http://java.sun.com/javase/6/docs/api/java/io /File.html). Por lo tanto, no puede leer directamente; debe abrir un ['FileInputStream'] (http://java.sun.com/javase/6/docs/api/java/io/FileInputStream.html) (o [ 'FileReader'] (http://java.sun.com/javase/6/docs/api/java/io/FileReader.html)) para eso. –

+0

Lo sé, así que necesito devolver un archivo inputstream desde este objeto de archivo simulado. Gracias por ayudar y pensar, la sugerencia a continuación parece ofrecer la solución buscada ... –

0

No utiliza el archivo (ni ninguna dependencia externa en las pruebas de unidad). Excepto el uso de simulacros, su enfoque dará lugar a pruebas problemáticas. Consulte this javaranch article para obtener más

+1

I Soy consciente de evitar archivos en pruebas unitarias. Es por eso que estaba buscando una maqueta o cualquier cosa que pueda falsificar un archivo. Basado en el nr. de puntos de vista que veo en esta pregunta, no soy el único que enfrenta este problema. Prefiero aquí lo que debería hacer, que lo que no debería hacer (especialmente si mi pregunta implica que sé lo que no debería hacer) :) –

1

Puede cargar el código de terceros utilizando un cargador de clases basado en ASM que asigna java.io.File a su propia implementación "falsa". Es un poco trabajo y debe realizarse con cuidado ... Por ejemplo, también necesitará asignar FileInputStream, etc.

+0

Ya no estaba buscando una respuesta, pero basándome en el nr de ve este es un problema al que se enfrentan muchas personas. Sin embargo, ¡este cargador de clases suena como una opción interesante para las pruebas! Vi algo aquí: http://stackoverflow.com/questions/1873916/is-it-possible-to-have-the-system-classloader-load-class-files-specified-at-run Tal vez puedas proporcionar algunas URL para las personas que van a probar esta opción? –

Cuestiones relacionadas