2016-04-26 1 views
0

javaクラスを生成して.javaファイルに書き込むメソッドがあります。 このメソッドに単体テストを書いて、これがファイルに書き込む文字列の形式が標準のJavaクラス形式であることを確認するにはどうすればいいですか?返された文字列にjavaクラスがあるかどうかをテストします

例:パッケージには、など、クラス宣言の前 開閉中括弧であれば、それはパッケージ宣言 を持っている場合、私がチェックすべきチェックする必要があります...

+2

なぜ、ソースコードをコンパイルして、コンパイルされたクラスについてアサーションを作成してみませんか? –

答えて

0

ここでコンパイルエラーを見つけるために使用することができる方法がありますJavaファイル、エラーが発生していない場合は完全に有効なJavaクラスです。あなたはちょうどそれが有効なJavaクラスであるかどうかを確認したい場合はBest way to process/handle Error stream messages

0

から撮影

import java.io.File; 
import java.io.IOException; 
import java.nio.file.Paths; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

import javax.tools.Diagnostic; 
import javax.tools.DiagnosticCollector; 
import javax.tools.JavaCompiler; 
import javax.tools.JavaFileObject; 
import javax.tools.StandardJavaFileManager; 
import javax.tools.ToolProvider; 

public class TestMain { 

    public static void main(String[] args) { 
     List<File> sourceList = Arrays.asList(Paths.get("MyJavaClass.java").toFile()); 
     List<String> errorList = new TestMain().compile(sourceList); 
     if(errorList.size() == 0) { 
      System.out.println("No error found, perfectly valid java class"); 
     } else { 
      errorList.forEach(System.out::println); 
     } 
    } 

    public List<String> compile (List<File> javaFileList) { 
     System.out.println("Started compilation"); 
     List<String> errorList = new ArrayList<String>(); 
     JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 

     DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>(); 
     StandardJavaFileManager fileManager = compiler.getStandardFileManager(
       diagnostics, null, null); 

     Iterable<? extends JavaFileObject> compilationUnits = fileManager 
       .getJavaFileObjectsFromFiles(javaFileList); 
     compiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits) 
       .call(); 

     for (Diagnostic<? extends JavaFileObject> diagnostic : diagnostics 
       .getDiagnostics()) { 
      String diagnosticMessage = String.format("Error on line %d in %s%n", 
        diagnostic.getLineNumber(), diagnostic.getSource().toUri() + " : \n\t" + diagnostic.getMessage(null)); 

      /*Following gives out of box good message, but I used above to show the custom use of diagnostic 
      * String diagnosticMessage = diagnostic.toString();*/ 

      errorList.add(diagnosticMessage); 
     } 
     try { 
      fileManager.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return errorList; 
    } 
} 

(つまり、コンパイルすることができます)、あなたは試すことができます。

try { 
      Class<?> clazz = MyTest.class.getClassLoader().loadClass("TargetClass"); 
      clazz.newInstance(); 
      } catch (Throwable e) { // Not a good idea to catch error, for test purpose only. 
       if(e instanceof Error && e.getMessage().contains("Unresolved compilation problems")){ 
        Assert.fail("Invalid class"); 
       } 
      } 

あなたはTargetClass.classこのテストチェックを実行する前に利用可能であることを確認するために、「javacの」プロセス(how to compile & run java program in another java program?を参照)をコールする必要がある場合があります。