0

私は現在、その場でコードを生成し、コンパイルしてから JUnit4 テストとして実行しようとしています。私は目標にかなり近づいていますが、plexus-compiler-eclipse またはコンパイルされたクラスのロード方法に問題がある可能性があります。説明させてください:

  1. シンプルな FileWriterWithEncoding を使用して Java コードをファイルに書き込みます
  2. EclipseJavaCompiler().performCompile(CompilerConfiguration) を使用して、plexus-compiler-eclipse (plexus-compiler-javac でも試しました) を使用して Java6 コード (source-target-compliance) としてコンパイルします。
  3. URLClassLoader.newInstance(new URL[] {resource }).loadClass("classname")リソースがどこにあるかを使用してクラスをロードします( classLoaderが上記と同じURLClassLoaderである場所でgetClass().getResource("filename")も試しました)getClass().forName(className, true, classLoader)
  4. 次に、JUnitCore のインスタンスを使用して、JUnitCore().run (上記のクラスをロードした結果) を使用して、生成されたテスト クラスを実行します。

JUnit がクラスのテスト メソッドを認識しないポイント 4 までは、すべて問題ないように見えます (生成されたコードの各テスト メソッドに @org.junit.Test という注釈を付けたのは明らかです)。デバッグ、ロードされたクラスで newInstance() を実行するか、ロードされたクラスを検査すると、注釈、パブリック メソッド、宣言されたフィールド、SFA がないことがわかります!!! newInstance() にはプライベート メンバーしかありません。これは、その参照型が Object であるため、正常ですが、何らかの形でキャストして、そこにあるはずのパブリック メソッドを呼び出すことができません。

実行時クラスを不完全にするコンパイル/クラスの読み込みで何が欠けているか考えていますか?

アイデアをお寄せいただきありがとうございます...

4

1 に答える 1

0

どうやら、これはかなり簡単でした!URLClassLoader に親がないことに気付いたこの回答が見つかりました。

于 2012-11-21T07:51:47.107 に答える