سؤال

أرغب في اختبار الوحدة للكود الخاص بي والذي سيتعين عليه إنشاء ملف .java وتجميعه ثم يجب إنشاء ملف .class المقابل.

كيف يمكنني إنشاء اختبار لمعرفة ما إذا كان الملف ".class" قد تم إنشاؤه؟لقد أضفت بالفعل اختبارًا لوجوده، والآن أحاول اختبار الملف باعتباره ملف فئة صالحًا.

حاولت

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

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

لكنني لا أعرف حقًا كيفية إضافة المسار الذي تم إنشاء الملف فيه إلى مسار الفصل ديناميكيًا.

يحرر

فئة 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");
}
هل كانت مفيدة؟

المحلول

استخدم مثيلًا جديدًا لـ 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());
}

نصائح أخرى

بدلاً من تحميل الفصل للتحقق منه، يمكنك إرسال أمر مثل "ملف Hello.class" لمعرفة ما إذا كان يُبلغ عن أنه ملف فئة Java، أو حتى إنشاء عملية فرعية من Java لتحميل الفصل خارج اختبار JVM الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top