باستخدام مخضرم لبناء منفصلة ملفات JAR على وحدة اختبار فئة مخصصة محمل

StackOverflow https://stackoverflow.com/questions/1401857

سؤال

كجزء من مشروع إنشاء فئة مخصصة محمل.جزء من وحدة اختبارات مخصصة محمل ينطوي على استخدام بعض ملفات JAR إلى إظهار السلوك السليم من محمل.

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

هل هناك نمط موحد لإنجاز هذا النوع من "بناء بعض الجرار على الجانب قبل مرحلة الاختبار ولكن ترك لهم للخروج من المسار الفئة" شرط ؟ لا أستطيع أن أصدق أنا أول شخص حاول القيام بذلك مع مخضرم 2, ولكن أنا لا يمكن أن يبدو ضرب على حق بوم هيكل التبعيات.عادة أنا في نهاية المطاف مع بعض اختبار الجرار لا يجري بناؤه قبل مرحلة الاختبار ، بل لقد كان أيضا مشاكل تتعارض مع النظام من بناء تسبب بناء على العمل بشكل صحيح على جهاز واحد ، ولكن تفشل في بناء بعض من اختبار الجرار على آخر.

هل كانت مفيدة؟

المحلول

وأبسط شيء نفعله هو اقامة مشروع آخر لحزم فصول للجرة اختبار الخاص بك، قم بتعيين بأنه عادي <وأ href = "http://maven.apache.org/guides/introduction/introduction- لتبعية mechanism.html # Dependency_Scope "يختلط =" noreferrer "> اختبار خاصة بتطبيق التبعية.

إذا كنت لا تريد / ليست قادرة على القيام بذلك، يمكنك استخدام البرنامج المساعد التجمع لخلق جرة في المرحلة process-test-classes (أي بعد أن تم تجميع الاختبارات ولكن قبل أن يتم تنفيذ الاختبارات). التكوين أدناه سوف تحتج المساعد التجمع لخلق وعاء يسمى classloader-test-deps في تلك المرحلة في الدليل الهدف. يمكن أن الاختبارات الخاصة بك ثم استخدام هذا جرة حسب الحاجة.

والبرنامج المساعد التجمع يستخدم واصف التجمع (في SRC / الرئيسي / التجمع، ودعا اختبار assembly.xml) أن حزم محتويات الهدف / اختبار الطبقات. لقد إنشاء فلتر لتضمين محتويات حزمة com.test وأبنائها. وهذا يفترض أن يكون لديك بعض اتفاقية اسم الحزمة يمكنك التقدم بطلب للحصول على محتويات الجرة.

وسوف المساعد التجمع افتراضيا إرفاق جرة باعتبارها الأداة الإضافية، من خلال تحديد attach كما كاذبة، فإنه لن يتم تثبيت / نشرها.

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>2.2-beta-2</version>
  <executions>
    <execution>
      <id>create-test-dependency</id>
      <phase>process-test-classes</phase>
      <goals>
        <goal>single</goal>
      </goals>
      <configuration>
        <finalName>classloader-test-deps</finalName>
        <attach>false</attach>
        <descriptors>
          <descriptor>src/main/assembly/test-assembly.xml</descriptor>
        </descriptors>
      </configuration>
    </execution>
  </executions>
</plugin>

وهذا هو مضمون الاختبار assembly.xml

<assembly>
  <id>test-classloader</id>
  <formats>
    <format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <fileSets>
    <fileSet>
      <directory>${project.build.testOutputDirectory}</directory>
      <outputDirectory>/</outputDirectory>
      <!--modify/add include to match your package(s) -->
      <includes>
        <include>com/test/**</include>
      </includes>
    </fileSet>
  </fileSets>
</assembly>

نصائح أخرى

وأود أن محاولة إعداد كل الاختبارات الخاصة بك من خلال الاختبار.والميزة الرئيسية هو أنه لا يوجد السحر الغيب الإعداد المتضمن للاختبار.الاختبار يمكن تشغيلها في كل بيئة.بالإضافة إلى ذلك هو أسهل بكثير من إضافة جديدة بدقة معزولة سيناريوهات كما كنت لا تعتمد على بعض مختلطة سيناريو الإعداد.

الإعداد ينبغي أن لا يكون من الصعب جدا:

  • تسلسل فئة java:
    • مع بعض رمز نوع الهندسة المكتبة
    • بدلا من ذلك استخدام فئة java الملف إعادة تسمية بعض الملفات لاحقة خلاف .فئة.ووضعها تحت الاختبار الموارد مجلد التحميل مع محمل فئة (getResourceAsStream(...)).
  • الرمز البريدي ملف فئة (`جافا.util.الرمز البريدي.GZIPOutputStream`)
  • تحميل ملف فئة مع فئة محمل

هناك نهج بديل يستخدم جافا محمل فئة التصميم و يعمل بدون جيل من فصول إضافية.

جافا فئة محمل الهرمي.كل فئة محمل لديه الفئة الأصل محمل.جذر من الدرجة محمل الهرمي هو التمهيد محمل فئة.عند فئة غير محملة على عربة الدرجة سوف تحاول تحميل الدرجة الأولى مع الطبقة الأم محمل ثم نفسها.

يمكنك تحميل اختبار الفصل مع الفصل الحالي محمل.جرة وتحميله مع الفئة الخاصة بك محمل.والفرق الوحيد هو أنه يمكنك تعيين فئة الأصل محمل واحد لا يمكن تحميل اختبار الفصل.

String resource = My.class.getName().replace(".", "/") + ".class";

//class loader of your test class
ClassLoader myClassLoader = currentThread().getContextClassLoader();
assert ! toList(myClassLoader.getResources(resource)).isEmpty();

//just to be sure that the resource cannot be loaded from the parent classloader
ClassLoader parentClassloader = getSystemClassLoader().getParent();
assert toList(parentClassloader.getResources(resource)).isEmpty();

//your class loader
URLClassLoader myLoader = new URLClassLoader(new URL[0], parentClassloader);
assert toList(myLoader.getResources(resource)).isEmpty();

ومخضرم يقرر بناء النظام عن طريق الاعتماد على التحليل، لذلك عادة الجرار من شأنه بناء في النظام بسبب واحد يستخدم الجرار الاختبار ببساطة تعلن لها تبعيات. ومع ذلك، يتم وضع تبعيات أيضا على CLASSPATH. "المدى" من تبعية يحدد أي CLASSPATH يمضي. على سبيل المثال "تجميع" تبعيات هي على CLASSPATH لتجميع واختبار وتشغيل. "وقت التشغيل" تبعيات هي على CLASSPATH للاختبار وتشغيل. 'اختبار' تبعيات هي فقط على CLASSPATH خلال الاختبار. للأسف، لديك قضية لا يشملها أي من النطاقات المتاحة: لديك تبعية، ولكنك لا ترغب في ذلك على CLASSPATH. هذه هي حالة استخدام هامش وهو السبب في أنك تواجه مشكلة أمثلة اكتشاف.

وهكذا، ما لم يربي بعض مخضرم المعلم يصل للدلالة على العكس من ذلك، أقترح هذا أمر مستحيل دون كتابة البرنامج المساعد مخضرم خاص. بدلا من ذلك، ومع ذلك، فإنني أوصي شيء آخر. هل حقا بحاجة الجرار مبنية خصيصا لاختبار classloader الخاصة بك؟ هذا يبدو مريب بالنسبة لي. ربما يمكنك استخدام أي JAR القديم؟ إذا كان الأمر كذلك، وأود أن استخدام مخضرم التبعية بين البرنامج المساعد لنسخ بعض JAR المعروفة لتكون دائما في المخزون الخاص بك (log4j على سبيل المثال) إلى الدليل الهدف وحدة المحلية الخاصة بك. يمكن اختبار الخاص بك، ثم الوصول إلى هذا JAR عبر أسم دليل على target/log4j-xxx.jar ويمكنك أن تفعل الشيء الخاص بك.

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