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");
}
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top