Como posso testar um arquivo .class foi criado?
-
20-09-2019 - |
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");
}
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.