私は現在、その場でコードを生成し、コンパイルしてから JUnit4 テストとして実行しようとしています。私は目標にかなり近づいていますが、plexus-compiler-eclipse またはコンパイルされたクラスのロード方法に問題がある可能性があります。説明させてください:
- シンプルな FileWriterWithEncoding を使用して Java コードをファイルに書き込みます
- EclipseJavaCompiler().performCompile(CompilerConfiguration) を使用して、plexus-compiler-eclipse (plexus-compiler-javac でも試しました) を使用して Java6 コード (source-target-compliance) としてコンパイルします。
URLClassLoader.newInstance(new URL[] {resource }).loadClass("classname")
リソースがどこにあるかを使用してクラスをロードします( classLoaderが上記と同じURLClassLoaderである場所でgetClass().getResource("filename")
も試しました)getClass().forName(className, true, classLoader)
- 次に、JUnitCore のインスタンスを使用して、JUnitCore().run (上記のクラスをロードした結果) を使用して、生成されたテスト クラスを実行します。
JUnit がクラスのテスト メソッドを認識しないポイント 4 までは、すべて問題ないように見えます (生成されたコードの各テスト メソッドに @org.junit.Test という注釈を付けたのは明らかです)。デバッグ、ロードされたクラスで newInstance() を実行するか、ロードされたクラスを検査すると、注釈、パブリック メソッド、宣言されたフィールド、SFA がないことがわかります!!! newInstance() にはプライベート メンバーしかありません。これは、その参照型が Object であるため、正常ですが、何らかの形でキャストして、そこにあるはずのパブリック メソッドを呼び出すことができません。
実行時クラスを不完全にするコンパイル/クラスの読み込みで何が欠けているか考えていますか?
アイデアをお寄せいただきありがとうございます...