2

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

2 に答える 2

4

URLClassLoaderターゲット クラス ファイルを作成したルート フォルダーを指すの新しいインスタンスを使用します。次に、Class.forName(String,ClassLoader);動的に作成されたメソッドを使用してURLClassLoader、新しいクラスをロードします。

動作することを示すために、次のテスト ケースではソース ファイルを作成し、そこに 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());
}
于 2009-11-15T20:31:34.590 に答える
1

クラスをロードして検証する代わりに、"file Hello.class" のようなコマンドを実行して、それが Java クラス ファイルであることが報告されているかどうかを確認したり、Java のサブプロセスを生成してクラスをロードしたりすることもできます。テスト JVM の外部。

于 2009-11-15T21:13:36.770 に答える