2016-04-26 7 views
0

У меня есть метод, который генерирует класс java и записывает в .java-файл. Как написать единичный тест для этого метода, чтобы убедиться, что формат строки, которую он записывает в файл, находится в стандартном формате класса java.Проверьте, имеет ли возвращенная строка java класс

Ex: Я должен проверить, если он имеет объявление пакета должны проверить, если пакет, прежде чем объявления класса открывать и закрывать скобки и т.д. ...

+2

Почему бы просто не попытаться скомпилировать исходный код, а затем сделать утверждения о скомпилированном классе? –

ответ

0

Вот метод, который может быть использован, чтобы найти ошибки компиляции в файлы Java, если нет ошибок, то это вполне допустимый Java-класс.

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; 
    } 
} 

Взятые из Best way to process/handle Error stream messages

0

Если вы просто хотите, чтобы проверить, если он является допустимым классом Java (который может быть скомпилирован), вы можете попробовать.

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"); 
       } 
      } 

Вы могли бы назвать процесс «JAVAC» (см how to compile & run java program in another java program?), чтобы убедиться, что TargetClass.class доступен перед запуском этой проверки теста.

Смежные вопросы