Sto creando un JUnit TestCase per un progetto che deve caricare un file di configurazione durante l'inizializzazione.getResourceAsStream da JUnit
Questo file di configurazione si trova all'interno del progetto nella cartella src/main/resources/config e durante il build maven lo inserisce nella cartella/config, all'interno del JAR.
La classe di inizializzazione, legge il file da lì con questa dichiarazione:
ClassLoader classloader = this.getClass().getClassLoader();
BufferedReader xmlSource = new BufferedReader(new InputStreamReader(classLoader.getResourceAsStream("/config/config.xml")));
Il problema che ho è che quando schiero ed eseguire questo vaso nel server di applicazione funziona come previsto, tuttavia, ogni volta che eseguirlo in un JUnit TestCase all'interno di Eclipse, il metodo getResrouceAsStream restituisce null.
Considerando che la classe è my.package.MyClassTest.java e che vive in src/test/java/my/package/MyClassTest.java, ho già provato a inserire una copia del file config.xml nel seguendo le cartelle senza successo:
- src/test/resources/config
- src/test/resources/my/package/config
- src/test/java/my/package/config
so che simili questioni sono state poste molte volte qui a StackOverflow, ma tutte le risposte che ho trovato si riferisce a cambiare il modo in cui il file viene caricato e, anche se cambiando il codice può essere un opzione, preferirei trovare il posto giusto per il file, quindi non ho bisogno di modificare cose che già funzionano nell'ambiente di produzione.
Quindi, dove devo posizionare questo file per poterlo utilizzare nel mio test JUnit?
UPDATE
Ho appena si avvicinò con la soluzione con un piccolo cambiamento nel codice: Invece di utilizzare la ClassLoader per ottenere la risorsa, ho usato direttamente la classe:
Class clazz = this.getClass();
BufferedReader xmlSource = new BufferedReader(new InputStreamReader(clazz.getResourceAsStream("/config/config.xml")));
E legge il file correttamente da src/test/resources/config/config.xml.
Tuttavia, c'è qualcosa di molto strano qui: Il metodo Class.getResourceAsStream è:
public InputStream getResourceAsStream(String name) {
name = resolveName(name);
ClassLoader cl = getClassLoader0();
if (cl==null) {
// A system class.
return ClassLoader.getSystemResourceAsStream(name);
}
return cl.getResourceAsStream(name);
}
E se il debug è, chiaramente posso vedere che questo getClassLoader0() restituisce esattamente lo stesso oggetto (stesso id) della chiamata precedente, this.getClass(). getResourceAsStream() (che ho mantenuto, solo per confrontare i valori) !!!
Cosa sta succedendo qui ?!
Perché chiamare direttamente il metodo non funziona, mentre si inserisce una nuova chiamata di metodo tra le opere?
Onestamente, sono davvero stupito di fronte a questo.
BTW, sto usando la versione 4.10 di JUnit. Potrebbe essere la manomissione della chiamata getClassLoader in qualche modo?
Molte grazie,
Carles
'src/test/resources /' una cartella di origine in Eclipse? –
@SotiriosDelimanolis se pubblichi questo come risposta, lo voterò. –
@SotiriosDelimanolis: Sì, lo è. In effetti, quando l'ho guardato mi sono reso conto che Eclipse lo prende di default per i progetti di Maven. –