2010-06-30 18 views
10

Qualcuno ha suggerimenti per un oggetto File finto java? Sto usando una classe di terza parte che ha bisogno di ottenere un oggetto java.io.File come argomento. Ricevo i dati per questo file in streaming su un webservice (anche uno dei loro prodotti).Suggerimenti per un file Mock java (per deridere java.io.File)

Una soluzione consiste nel scrivere tutti questi dati in un file e offrire questo alla classe. Questa è una soluzione che non mi piace: toglie il vantaggio di usare il webservice invece di scaricare il file.

più veloce ed efficiente sarebbe quello di mettere questi dati dalla memoria in un file Mock e offrire questo file Mock alla classe di terze parti.

Probabilmente dovrebbe essere un MockFile che estende java.io.File e sovrascrive tutte le funzioni che eseguono effettivamente l'interfacciamento con il file sul disco rigido.

So che il di terze parti avrebbe dovuto utilizzare un flusso come un argomento di ingresso al posto di un file. Tuttavia, questo è al di là della mia influenza.

+0

Grazie per tutte le risposte ... E apears per me un file Mock non è la soluzione. .. l'unica cosa che posso fare con questo, è creare un oggetto File esteso che generi automaticamente un file e darlo alla classe di terze parti. Per quello che volevo veramente .... la classe di terze parti dovrebbe accettare un InputStream come argomento. Ma questo può essere fatto anche usando il suggerimento sul wrapper. Un po 'frustrante la classe di terze parti accetta solo un file. –

+0

Hai considerato l'utilizzo di [Commons VFS] (http://commons.apache.org/vfs/)? – mickthompson

+0

Come indicato sopra, questo pacchetto sembra offrire la soluzione che sto cercando ... ti farà sapere se questo è utile. –

risposta

5

Questo è solo un suggerimento in base alla mia comprensione della tua domanda. credo, è necessario fare qualcosa di simile,

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

oggetti mock più senso dal punto di vista unit testing. Il tuo obiettivo non è quello di testare la funzione di libreria di terze parti. Se si tratta del metodo unit test doSomething(). Quindi probabilmente è possibile creare un involucro attorno al terzo function.Maybe qualcosa di simile,

public class Wrapper implements MyWrapper{ 

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

Ora è possibile creare un wrapper finto (attuazione della stessa interfaccia) e utilizzare questo wrapper finta per tutti i vostri casi JUnit.

+0

Grazie, questo in combinazione con la risposta sul VFS comune probabilmente farà il trucco. (serve qualcosa come il comune VFS per creare un file virtuale mentre non si sta effettivamente creando il file su harddisk) –

+0

Benvenuto e buona fortuna. – chedine

2

Ha la classe testato interrogare solo il nome del file finto, attributi, ecc, o lo fa in realtà tentare di aprire il file?

Nel primo caso, è possibile creare facilmente il proprio modello utilizzando ad es. EasyMock o una struttura di simulazione equivalente.

Quest'ultimo caso è più complicato e temo che se il flusso di input viene creato internamente dalla classe, non si ha altra scelta che creare un vero file di test sull'HD.

+0

In realtà vuole ottenere (leggere) i dati dal file. Quindi sto cercando un file di mock leggendo anche gli override ... E leggi i dati nella memoria (nel file mock) So che è più complicato, ma spero che qualcuno abbia già fatto questo ... –

+0

@ michel, il problema è, 'File' è solo" una rappresentazione astratta di nomi di file e directory "[(dal Javadoc)] (http://java.sun.com/javase/6/docs/api/java/io /File.html). Quindi non puoi leggere direttamente da esso: devi aprire un ['FileInputStream'] (http://java.sun.com/javase/6/docs/api/java/io/FileInputStream.html) (oppure [ 'FileReader'] (http://java.sun.com/javase/6/docs/api/java/io/FileReader.html)) per quello. –

+0

Lo so, quindi ho bisogno di restituire un file inputstream da questo oggetto file mock. Grazie per l'aiuto e il pensiero lungo, il suggerimento di seguito sembra offrire la soluzione cercata .... –

0

Non si utilizza il file (o qualsiasi dipendenza esterna in Prove di unità). Tranne l'utilizzo di mock, i tuoi approcci risulteranno in test problematici. Vedere this javaranch article per più

+1

I Sono consapevole di evitare i file nei test unitari. Ecco perché stavo cercando un mockup o qualsiasi cosa in grado di simulare un file. Basato sul nr. di opinioni che vedo su questa domanda, io non sono l'unico che affronta questo problema. Preferirei qui ciò che dovrei fare, rispetto a ciò che non dovrei fare (soprattutto se la mia domanda implica che so cosa non dovrei fare) :) –

1

Si potrebbe caricare il codice 3rd party utilizzando un programma di caricamento classe basata ASM che mappa java.io.File per la propria implementazione "falso". E 'un po' di lavoro, e deve essere eseguita con cura ... Per esempio sarà necessario mappare anche FileInputStream, ecc

+0

Non cercavo più una risposta, ma basato sul nr di vede questo è un problema che molte persone stanno affrontando. Questo classloader sembra comunque un'opzione interessante per testare comunque! Ho visto qualcosa qui: http://stackoverflow.com/questions/1873916/is-it-possible-to-have-the-system-classloader-load-class-files-specified-at-run Forse puoi fornire alcuni URL per le persone che intendono provare questa opzione? –

Problemi correlati