2017-03-20 13 views
0

現在、私は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(...)のアプローチではクラスがロードされていないようです。

正しいアプローチは何ですか?ありがとう!

+0

他のJavaプログラムからJavaプログラムを実行しようとしていますが、これは正しいですか? – CS2016

+0

はい、具体的には、Javaプログラムで実行されているJUnitテストスイートです。 – wayway

答えて

0

私はJUnitのを使用してについてはよく分からないが、私はこれを行うには見つけ最も簡単な方法は、あなたが実行可能なJARファイルとして実行しようとしているクラスをエクスポートし、そのようなコマンドラインを介して、それを実行することです:

String cmd = "java - jar NAME OF YOUR PROGRAM.JAR"; 
try { 
      //Execute the command 
      Runtime.getRuntime().exec(cmd); 
      counter++; 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

呼び出すプログラムは、呼び出すプログラムと同じディレクトリにあるか、実行しようとしているjarへのファイルパスである必要があります。

私が言ったように、私はJUnitファイルを実行することについてはわかりませんが、実行可能なjarファイルとしてエクスポートすることができるのであれば、同じアイデアでなければなりません。

+0

コメントありがとうございます。以前はRuntime.getRuntime()。exec(cmd)を使っていました。実際、私はそれを使ってJavaファイルを最初にコンパイルしています。しかし、新しいアプローチでは、JUnitCore.runClasses(...)を使用してプログラムをすべて実行する必要があります。これにより、失敗出力を簡単に取り出すことができます。問題は特に、適切にクラスを読み込んでいます... – wayway

関連する問題