Pergunta

Quero testar o meu código que terá que criar um arquivo .java compilá -lo e, em seguida, o arquivo .class correspondente deve ser criado.

Como posso criar o teste para ver se o arquivo ".class" é criado? Já adicionei o teste para sua existência, agora estou tentando testar o arquivo é um arquivo de classe válido.

eu tentei

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

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

Mas eu realmente não sei como adicionar dinamicamente o caminho em que o arquivo é criado ao caminho de classe.

EDITAR

A classe URL carregada faz o trabalho.

É assim que meu teste parece agora.

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

Solução

Use uma nova instância de um URLClassLoader, apontando para a pasta raiz onde você criou o arquivo de classe de destino. Então, use o Class.forName(String,ClassLoader); método com o criado dinamicamente URLClassLoader para carregar a nova classe.

Para mostrar que funciona, o seguinte caso de teste criará um arquivo de origem, escreverá algum código Java e compilará -o usando as interfaces Java 6 ToolProvider. Em seguida, ele carregará dinamicamente a classe usando um URLClassLoader e invocará uma chamada reflexiva para o nome da classe para verificar se é realmente essa classe que foi gerada em tempo real.

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

Outras dicas

Em vez de carregar a classe para verificá-la, você pode desembolsar um comando como "arquivo hello.class" para ver se relata que é um arquivo de classe Java ou até mesmo gerar um subprocesso de java para carregar a classe Fora da sua JVM de teste.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top