如何测试.class文件是否已创建?

我想对我的代码进行unit testing,必须创建一个.java文件来编译它,然后创建相应的.class文件。

如何创建测试以查看是否创建了“.class”文件? 我已经为它的存在添加了测试,现在我正在尝试测试该文件是一个有效的类文件。

我试过了

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

但我真的不知道如何动态地将创建文件的路径添加到类路径中。

编辑

加载的URL类可以完成工作。

这就是我的测试现在的样子。

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

使用URLClassLoader的新实例,指向创建目标类文件的根文件夹。 然后,使用Class.forName(String,ClassLoader); 方法用动态创建的URLClassLoader来加载新类。

为了certificate它有效,下面的测试用例将创建一个源文件,在那里编写一些Java代码并使用Java 6 ToolProvider接口进行编译。 然后,它将使用URLClassLoader动态加载类,并调用对其类名的reflection调用,以validation它是否是即时生成的此类。

 @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 files = new ArrayList(); 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 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()); } 

您可以使用类似“文件Hello.class”的命令来查看它是否是java类文件,或者甚至生成java的子进程以加载类,而不是加载类以进行validation。在测试JVM之外。