تشغيل Junit & Powermock مع Mockito من خلال PowerMockrunner من Maven
سؤال
أنا لا أتمكن من تشغيل Powermock عبر Maven. أنا Powermock Mockito و PowerMockrunner لقيادة اختبار Junit.
هذا الاختبار:
@RunWith(PowerMockRunner.class)
@PrepareForTest( { UserLocalServiceUtil.class, ExpandoBridge.class })
public class AlertNotificationsTest {
//...
لم أقم بتكوين أي شيء خاص لتشغيل الاختبار. يشير POM الخاص بي إلى DEPS التالية:
- org.mockito | mockito-all | 1.8.0
- جونيت | جونيت | 4.6.0
- org.powermock.modules | Powermock-Module-Junit4 | 1.3.1
- org.powermock.api | powermock-api-mockito | 1.3.1
عندما أركض mvn -Dtest=AlertNotificationsTest test
يقول MVN أنه لا يوجد اختبار للتشغيل. ولكن إذا قمت بتشغيل نفس فئة الاختبار من Eclipse ، فكل شيء يعمل بشكل جيد.
أفعل شيئا خاطئا؟
ها هي pom.xml أدناه (الأجزاء ذات الصلة)
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>5.9</version>
<classifier>jdk15</classifier>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.6</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.8.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock.modules</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock.api</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.3.1</version>
<scope>test</scope>
</dependency>
</dependencies>
ها هو الإخراج من Maven
mvn -dtest = اختبار AlertNotificationStest
...
[INFO] Surefire report directory: C:\Devel\Java\EP_PORTAL\information-provider\target\surefi
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running TestSuite
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.313 sec
Results :
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] No tests were executed! (Set -DfailIfNoTests=false to ignore this error.)
[INFO] ------------------------------------------------------------------------
ملحوظة: يمكنني إجراء اختبارات أخرى ، لا يمكنني إجراء هذا الاختبار. إذا قمت بعمل AlertNotificationsTest
فئة تمتد junit.framework.TestCase
يتم التقاط الفصل بواسطة Maven ، لكن يبدو أنه لا يحصل على مدفوع به PowerMockRunner
.
هذا هو ناتج ذلك:
Running TestSuite
[ERROR]: No test suite found. Nothing to run
Tests run: 4, Failures: 2, Errors: 0, Skipped: 0, Time elapsed: 1.053 sec <<< FAILURE!
Results :
Failed tests:
testSingleEventNotification(pt.estradasportugal.traffic.services.events.AlertNotificationsTest)
testTwoEventNotification(pt.estradasportugal.traffic.services.events.AlertNotificationsTest)
Tests run: 4, Failures: 2, Errors: 0, Skipped: 0
مرة أخرى ، تعمل هذه الاختبارات على ما يرام مع Eclipse.
تحديث لقد وجدت مشكلة محتملة وحل. لدي اختبارات مع testng و Junit. إذا قمت بإزالة testng من POM الخاص بي وترحيل جميع اختباراتي إلى Junit ، فأنا قادر على إجراء اختبار PowerMock الخاص بي mvn test
. لذلك يبدو أن هناك مشكلة مع Maven و Junit/Testng Combo.
أود أن أكون قادرًا على الجري على حد سواء ، لكن إذا لم أجد طريقة سأذهب وأجب على سؤالي. شكرا الرجال والبنات
المحلول 7
كانت هناك مشكلة عند خلط اختبارات TestNg & Junit. ترحيل جميع الاختبارات إلى Junit حل مشكلتي. شكرا يا رفاق.
نصائح أخرى
لقد عانيت من هذا الخطأ وعملت من خلال الحل. كان ملف pom.xml الخاص بي التبعية التالية:
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-mockito-release-full</artifactId>
<version>1.5</version>
<classifier>full</classifier>
<scope>test</scope>
</dependency>
تأتي المشكلة من حقيقة أن الكود الخاص بي يستخدم Junit والاعتماد أعلاه له اعتماد خارجي على testng. كان هذا يمنع الاختبار من الجري. لماذا لا أعرف - سيكون لديك على الرغم من أن إطار اختبار كان من الممكن اختباره بشكل أفضل قليلاً !!!
على أي حال ، كان الحل هو تحطيم التبعيات "الكاملة" لتلك المطلوبة فقط:
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-core</artifactId>
<version>1.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.5</version>
<scope>test</scope>
</dependency>
التي حلها. راجع للشغل اعتدت mvn dependency:tree
لفهم التبعيات المرتبطة.
لا يمكنني إعادة إنتاج مشكلتك. مع المحتوى التالي في pom.xml الخاص بي:
<repositories>
<repository>
<id>powermock-repo</id>
<url>http://powermock.googlecode.com/svn/repo/</url>
</repository>
</repositories>
<properties>
<powermock.version>1.3.1</powermock.version>
</properties>
<dependencies>
<dependency>
<groupId>org.powermock.modules</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock.api</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.6</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.8.0</version>
</dependency>
</dependencies>
وفئة الاختبار التالية (تخطي الواردات):
@RunWith(PowerMockRunner.class)
@PrepareForTest( { App.class })
public class AppTest {
@Test
public void testApp() {
assertTrue(true);
}
}
ادارة mvn test -Dtest=AppTest
فقط يعمل بشكل جيد وأعطيني الإخراج التالي:
... ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.mycompany.app.AppTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.135 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ [INFO] Total time: 3 seconds [INFO] Finished at: Wed Nov 25 17:34:32 CET 2009 [INFO] Final Memory: 9M/79M [INFO] ------------------------------------------------------------------------
لذا فإن السؤال هو: هل لديك طريقة مشروحة @Test
في AlertNotificationsTest
?
صادفت هذه القضية أيضًا ، لكنها ليست مشكلة باورموك. تم تسمية فصل الاختبار الخاص بي XStatictests.java.
عندما أقوم بتشغيل "MVN Clean Test" ، لن يتم تشغيل هذا الاختبار ، فهو يعمل فقط عندما حددت الاختبار باستخدام "-dtest = ..."
يذكر وثائق Surefire أنه بشكل افتراضي فقط يتم البحث عن هذه الأنماط: "/testm.java " - يشمل جميع الأطراف الفرعية وجميع أسماء الملفات Java التي تبدأ بـ" Test "./Test.Java " - يشمل جميع الأطراف الفرعية وجميع أسماء ملفات Java التي تنتهي بـ" Test ".*/*testcase.java " - يتضمن جميع الأطراف الفرعية وجميع أسماء ملفات Java التي تنتهي بـ" testcase ".
لذلك ، سيتم تغيير اسم className إلى واحد ينتهي بأحد هذه الأشياء ، حيث يتم استدعاء "اختبار MVN" ، وإلا ، يجب تكوين المكون الإضافي المؤكد مع اسم الفصل على وجه التحديد.
يبدو إعداد PowerMock جيدًا بالنسبة لي ، وتبدو الجرار على ما يرام (على افتراض أن تبعيات Maven Transitive تحصل على الجرار الأخرى - لدينا حوالي 6-7 بعد أن يحصل عليها العزم اللبلاب)
قد تستخدم Eclipse مكتبة Junit "الداخلية" الخاصة بها ، وبالتالي السلوكيات المختلفة؟
هل الاختبار مشروح مع org.junit.@test؟
إذا نظرت إلى مصدر البرنامج المساعد المؤكد ، فإنه يقوم ببعض الأشياء المتسللة. إذا وجدت أي حزم testng في classloader ، فسيختار تشغيل testng testrunner. لم أر بعد أي أمثلة على اختبارات Junit و TestNg التي تعمل بشكل جيد جنبًا إلى جنب.
واجهت نفس المشكلة ، واستغرق الأمر بعض الوقت لمعرفة ذلك. كان الإعداد الخاص بي يسحب نسخة أقدم من jboss.javassist ، والتي كانت تمنع على نحو غريب من PowerMockrunner من العمل على الإطلاق.
تجدر الإشارة إلى أن لدي أيضًا بيئة مختلطة Junit / Testng. لقد جربت سابقًا حل إضافة العديد من مزودي Surefire ، ولم ينجح ذلك أيضًا (باستخدام Surefire 2.14.1). بعد الترقية إلى Surefirefire 2.17 ، بدأت اختبارات Junit و Testng الخاصة بي دون الحاجة إلى إعلان أي مقدمي خدمات مؤكد.
هذا هو قسم البرنامج المساعد الخاص بي ...
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.17</version>
<configuration>
<groups>spring, unit, integration</groups>
<systemPropertyVariables>
<java.awt.headless>true</java.awt.headless>
<org.apache.activemq.default.directory.prefix>target/test/</org.apache.activemq.default.directory.prefix>
<log4j.configuration>file:${project.basedir}/src/test/resources/log4j.properties</log4j.configuration>
</systemPropertyVariables>
<argLine>${surefire.args}</argLine>
</configuration>
</plugin>
... و DEPS الاختبار ذات الصلة ...
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.9.5</version>
<scope>test</scope>
</dependency>
<!--
PowerMock versions are compatible with specific Mockito versions.
https://code.google.com/p/powermock/wiki/MockitoUsage13
-->
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.5.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.5.4</version>
<scope>test</scope>
</dependency>
<!-- without this PowerMock tests don't run in maven -->
<dependency>
<groupId>jboss</groupId>
<artifactId>javassist</artifactId>
<version>3.8.0.GA</version>
<scope>test</scope>
</dependency>