Как я могу проверить, что файл .class был создан? - PullRequest
2 голосов
/ 15 ноября 2009

Я хочу провести модульное тестирование своего кода, который должен будет создать файл .java, скомпилировать его, а затем создать соответствующий файл .class.

Как создать тест, чтобы проверить, создан ли файл ".class"? Я уже добавил тест для его существования, теперь я пытаюсь проверить, является ли файл допустимым файлом класса.

Я пытался

 try  {
      Class.forName("Hello");
      throw AssertError();
 } catch( ClassNotFoundException e ) {
 }

 program.createClass();
 Class.forName("Hello");

Но я не знаю, как динамически добавить путь, по которому файл создается, к пути к классам.

EDIT

URL-класс загружен делает работу.

Вот так теперь выглядит мой тест.

@Test
void testHello() throws MalformedURLException, ClassNotFoundException {
    URL[] url = {
            new URL("file:/home/oreyes/testwork/")
    };

    try {
        new URLClassLoader(url).loadClass("Hello");
        throw new AssertionError("Should've thrown ClassNotFoundException");
    } catch ( ClassNotFoundException cnfe ){

    }
    c.process();
    new URLClassLoader(url).loadClass("Hello");
}

Ответы [ 2 ]

4 голосов
/ 15 ноября 2009

Используйте новый экземпляр URLClassLoader, указывающий на корневую папку, в которой вы создали файл целевого класса. Затем используйте метод Class.forName(String,ClassLoader); с динамически созданным URLClassLoader для загрузки нового класса.

Чтобы показать, что это работает, следующий тестовый пример создаст исходный файл, напишет туда некоторый код Java и скомпилирует его с использованием интерфейсов Java 6 ToolProvider. Затем он будет динамически загружать класс с помощью URLClassLoader и вызывать рефлексивный вызов его имени класса, чтобы убедиться, что это действительно тот класс, который был создан на лету.

@Test
public void testUrlClassLoader() throws Exception {
    Random random = new Random();
    String newClassName = "Foo" + random.nextInt(1000);
    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
    List<File> files = new ArrayList<File>();
    File sourceFolder = new File(".");
    File sourceFile = new File(sourceFolder, newClassName + ".java");
    FileWriter fileWriter = new FileWriter(sourceFile);
    fileWriter.write("public class " + newClassName + " { { System.out.println(\""
            + newClassName + " loaded\"); }}");
    fileWriter.close();
    files.add(sourceFile);
    Iterable<? extends JavaFileObject> compilationUnits1 = fileManager
            .getJavaFileObjectsFromFiles(files);
    compiler.getTask(null, fileManager, null, null, null, compilationUnits1).call();
    fileManager.close();

    URL url = sourceFolder.toURI().toURL();
    URLClassLoader urlClassLoader = new URLClassLoader(new URL[] { url });
    Object newInstance = urlClassLoader.loadClass(newClassName).newInstance();
    assertEquals(newClassName, newInstance.getClass().getName());
}
1 голос
/ 16 ноября 2009

Вместо того, чтобы загружать класс, чтобы проверить его, вы можете использовать команду типа «файл Hello.class», чтобы проверить, сообщает ли она, что это файл класса Java, или даже создать подпроцесс Java для загрузить класс за пределами вашей тестовой JVM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...