Come faccio a testare un file .class è stato creato?
-
20-09-2019 - |
Domanda
Voglio unità di testare il mio codice che dovrà creare un file .java compilarlo e quindi il file .class corrispondente dovrebbe essere creato.
Come posso creare il test per vedere se è stato creato il file ".class"? Ho aggiunto di test già per la sua esistenza, ora sto cercando di testare il file è un file di classe valido.
Ho cercato
try {
Class.forName("Hello");
throw AssertError();
} catch( ClassNotFoundException e ) {
}
program.createClass();
Class.forName("Hello");
Ma io non so davvero come aggiungere dinamicamente il percorso in cui il file viene creato al classpath.
Modifica
Classe URL caricato fa il lavoro.
Questo è come la mia prova sembra ora.
@Test
void testHello() throws MalformedURLException, ClassNotFoundException {
URL[] url = {
new URL("file:/home/oreyes/testwork/")
};
try {
new URLClassLoader(url).loadClass("Hello");
throw new AssertionError("Should've thrown ClassNotFoundException");
} catch ( ClassNotFoundException cnfe ){
}
c.process();
new URLClassLoader(url).loadClass("Hello");
}
Soluzione
Utilizzare una nuova istanza di un URLClassLoader
, indicando la cartella principale in cui è stato creato il file di classe di destinazione. Quindi, utilizzare il metodo Class.forName(String,ClassLoader);
con l'URLClassLoader
creato in modo dinamico per caricare la nuova classe.
Per mostrare che funziona, il seguente caso di test creerà un file sorgente, scrivere del codice Java in là e compilarlo utilizzando le interfacce ToolProvider Java 6. Poi, caricherà dinamicamente la classe utilizzando un URLClassLoader e invocare una chiamata riflettente al suo nome di classe per verificare che sia davvero questa classe che è stato generato al volo.
@Test
public void testUrlClassLoader() throws Exception {
Random random = new Random();
String newClassName = "Foo" + random.nextInt(1000);
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
List<File> files = new ArrayList<File>();
File sourceFolder = new File(".");
File sourceFile = new File(sourceFolder, newClassName + ".java");
FileWriter fileWriter = new FileWriter(sourceFile);
fileWriter.write("public class " + newClassName + " { { System.out.println(\""
+ newClassName + " loaded\"); }}");
fileWriter.close();
files.add(sourceFile);
Iterable<? extends JavaFileObject> compilationUnits1 = fileManager
.getJavaFileObjectsFromFiles(files);
compiler.getTask(null, fileManager, null, null, null, compilationUnits1).call();
fileManager.close();
URL url = sourceFolder.toURI().toURL();
URLClassLoader urlClassLoader = new URLClassLoader(new URL[] { url });
Object newInstance = urlClassLoader.loadClass(newClassName).newInstance();
assertEquals(newClassName, newInstance.getClass().getName());
}
Altri suggerimenti
Invece di caricare la classe al fine di verificare, si potrebbe sborsare per un comando come "presentare Hello.class" per vedere se riferisce che si tratta di un file di classe Java, o persino generare un sotto-processo di Java per caricare la classe al di fuori della vostra JVM di prova.