Frage

Ich möchte meinen Code Unit-Test, der eine .java-Datei kompilieren erstellen müssen und dann sollten die entsprechenden .class-Datei erstellt werden.

Wie kann ich den Test, um zu sehen, ob die „.class“ Datei erstellt wird? I-Test hinzugefügt habe bereits für seine Existenz, jetzt versuche ich, die Datei zu testen, ist eine gültige Klassendatei.

Ich habe versucht,

 try  {
      Class.forName("Hello");
      throw AssertError();
 } catch( ClassNotFoundException e ) {
 }

 program.createClass();
 Class.forName("Hello");

Aber ich weiß nicht wirklich, wie dynamisch den Pfad hinzuzufügen, in dem die Datei auf den Classpath erstellt wird.

Bearbeiten

URL-Klasse geladen, um die Arbeit der Fall ist.

Dies ist, wie mein Test sieht nun.

@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");
}
War es hilfreich?

Lösung

Verwenden Sie eine neue Instanz eines URLClassLoader, indem er auf den Stammordner, in dem Sie die Zielklassendatei erstellt. Verwenden Sie dann die Class.forName(String,ClassLoader); Methode mit dem dynamisch erzeugten URLClassLoader die neue Klasse zu laden.

Um zu zeigen, dass es funktioniert, wird der folgende Testfall eine Quelldatei erstellen, einige Java-Code in dort schreiben und kompilieren sie die Java 6 ToolProvider Schnittstellen. Dann wird es dynamisch die Klasse lädt einen URLClassLoader und invoke einen reflektierenden Aufruf seine Klassennamen ist es wirklich diese Klasse zu überprüfen verwendet, die im laufenden Betrieb erzeugt wurden.

@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());
}

Andere Tipps

Statt die Klasse, um das Laden um es zu überprüfen, können Sie auf einen Befehl wie „Datei Hello.class“ berappen, um zu sehen, ob es berichtet, dass es sich um eine Java-Klasse-Datei ist, oder sogar einen Teilprozess von Java laichen lädt die Klasse außerhalb des Tests JVM.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top