سؤال

أنا لا أتمكن من تشغيل 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>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top