現在、私はTestSuite.java
と呼ばれる既存のJUnitテストスイートを持っています。プログラムによるJavaファイルの作成、ロード、実行
次に、BufferedWriter
を使用して、TestSuiteMinimized.java
という名前の新しいJavaファイルを作成します。
次に、javac
コマンドを必要なクラスパスで実行するプロセスを使用して、プログラムでファイルをコンパイルします。
問題は、この新しく作成されたJavaファイルを実行できないことが問題です。
private static Map<String, String> runJavaFile(String filePath) {
Class<?> test;
try {
test = Class.forName(getClassName(filePath), true, ClassLoader.getSystemClassLoader());
} catch (ClassNotFoundException e) {
System.err.println("Class not found in file: " + filePath);
e.printStackTrace();
System.exit(1);
return null;
}
// Map from method name to failure trace.
Map<String, String> runResultMap = new HashMap<String, String>();
Result result = JUnitCore.runClasses(test);
for (Failure failure : result.getFailures()) {
runResultMap.put(failure.getDescription().getMethodName(), removeLineNumbersFromTrace(failure.getTrace()));
}
return runResultMap;
}
私は最初だけTestSuite.javaが存在し、TestSuiteMinimized.javaがまだ作成されていないプログラムを実行すると、私はClassNotFoundExceptionが得られます。しかし
Class not found in file: C:\Users\Wayway\workspace\Project1\src\TestSuiteMinimized.java
java.lang.ClassNotFoundException: TestSuiteMinimized
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at Project1.runJavaFile(Project1.java:739)
at Project1.mainMinimize(Project1.java:176)
at Project1.main(Project1.java:105)
、私はもう一度プログラムを実行した場合TestSuiteMinimized.javaが作成され、コンパイルされると、これがロードされ、ClassNotFoundExceptionがなくなります。しかし、私は複数の反復でTestSuiteMinimized.javaに書きます。TestSuiteMinimized.javaの新しいバージョンが実行されていないようです。むしろ、TestSuiteMinimized.javaの最初のバージョンのみがロードされます。
これはClassLoaderの問題ですが、上記のClass.forname(...)のアプローチではクラスがロードされていないようです。
正しいアプローチは何ですか?ありがとう!
他のJavaプログラムからJavaプログラムを実行しようとしていますが、これは正しいですか? – CS2016
はい、具体的には、Javaプログラムで実行されているJUnitテストスイートです。 – wayway