2009-11-15 69 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

相關問題