外部クラスのテストを動的に実行するメソッドを作成しようとしています。JDK ライブラリのみを使用するテストを実行できますが、org.jmock.Mockery などの別のライブラリを使用するテストを実行すると、JUnitCore.run(args) によって返される結果オブジェクトに次のエラーが発生します。
[initializationError(package.TestClass): org/jmock/Mockery]
java.lang.NoClassDefFoundError: org/jmock/Mockery
com.sun.jdi.ClassNotLoadedException: Type has not been loaded occurred while retrieving component type of array.
言うまでもなく、Eclipse で元のプロジェクトからテストを実行すると、テストが実行されて合格します。
ClassLoader はテスト対象のクラスのみをロードしているように見え、外部プロジェクトのクラスパスで定義された依存関係 (jar など) をロードしていないように見えるため、この問題はクラスパスに関連していると思います。実行中のアプリケーションに jar を動的にロードする方法がわかりません。
以下は、クラスをロードしてテストを実行するコードです。
URL url = new File("E:\eclipseProjectName\bin\").toURL();
final URL[] urls = new URL[] { url };
final ClassLoader cl = new URLClassLoader(urls);
@SuppressWarnings("rawtypes")
final Class cls = cl.loadClass("package.ClassName");
final JUnitCore core = new JUnitCore();
final Result result = new JUnitCore().run(Request.method(cls, "methodName"));
前もって感謝します、
マーク・カチア