Pregunta

Quiero probar mi unidad de código que tendrá que crear un archivo .java compilarlo y luego el archivo .class correspondiente debe ser creado.

¿Cómo puedo crear la prueba para ver si se crea el archivo ".class"? He añadido ya prueba de su existencia, ahora estoy tratando de probar el archivo es un archivo de clase válida.

He intentado

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

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

Pero no se sabe muy bien cómo agregar dinámicamente la ruta en la que se crea el archivo a la ruta de clase.

Editar

Clase URL cargado hace el trabajo.

Así es como mi prueba parece ahora.

@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");
}
¿Fue útil?

Solución

Utilice una nueva instancia de un URLClassLoader, apuntando a la carpeta raíz en la que creó el archivo de clase de destino. A continuación, utilice el método Class.forName(String,ClassLoader); con el URLClassLoader creado dinámicamente para cargar la nueva clase.

Para demostrar que funciona, el siguiente caso de prueba creará un archivo de origen, escribir algo de código Java allí y compilarlo usando las interfaces de Java 6 ToolProvider. A continuación, se carga dinámicamente la clase utilizando un URLClassLoader e invocar una llamada de reflexión a su nombre de clase para verificar que realmente esta clase que se ha generado sobre la marcha.

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

Otros consejos

En lugar de cargar la clase con el fin de verificar que, usted podría pagar a un comando como "Hello.class presentar" para ver si se informa de que se trata de un archivo de clase Java, o incluso generar un sub-proceso de Java para cargar la clase fuera de su JVM prueba.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top