2009-11-15 61 views
2

我想单元测试我的代码,它必须创建一个.java文件进行编译,然后创建相应的.class文件。如何测试创建的.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"); 
} 
+0

hehe'testng'不是拼写错误,而是测试框架的名称:) – OscarRyz 2009-11-15 21:13:11

回答

4

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

为了证明它的工作原理,以下测试用例将创建一个源文件,在其中编写一些Java代码并使用Java 6 ToolProvider接口编译它。然后,它将使用URLClassLoader动态加载该类,并调用对其类名称的反射调用来验证它是否真的是即时生成的这个类。

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

我试过'new URLClassLoader(new URL [] {new URL(“file:〜/ testwork”)});''但没有工作。 – OscarRyz 2009-11-15 21:08:00

+1

〜不是Java主目录的有效捷径。它只适用于一些Unix程序。 – 2009-11-15 21:31:23

1

而是为了验证它加载类的,你可以掏出来,如“文件Hello.class”命令,看看它报告说,它是一个Java类文件,甚至酿出子java的进程在您的测试JVM之外加载类。

+0

如...'“javac Hello.java; java Hello”'? MMhhh可以工作。只是最终这个东西会创建越来越多的东西,我只是想(在这个阶段)去测试.class是否被创建,以及它是否是一个有效的java类(我的Hello.java是:'class Hello {} ') – OscarRyz 2009-11-15 21:21:55

+0

那么,我不一定是指“javac Hello.java; java Hello”。您可以使用“file Hello.class”来检查文件是否为非零,并且具有正确的幻数以成为Java类。然后,如果你想要更强大的东西,你可以有一个新的简单的类,用Class.forName(“args [0]”)通过名字加载你的类。我的观点是,不是限制自己使用现有的JVM,而是创建一个新的进程并在那里工作。 – Suppressingfire 2009-11-16 11:39:25