Domanda

Per qualche motivo non riesco a Maven 2 plug infallibile per eseguire JUnit 4 classe di test.

public class SimpleTest {
  @org.junit.Test
  public void simple() {
     System.out.println("foo");
  }
}

Tuttavia se cambio questa classe per essere JUnit-3, come, ad esempio

public class SimpleTest extends junit.framework.TestCase {
  public void testBar() {
     System.out.println("bar");
  }

  @org.junit.Test
  public void simple() {
     System.out.println("foo");
  }
}

allora viene eseguito. Ecco quello che ho fatto:

  • verificato versione Maven: Apache Maven 2.2.1 (r801777; 2009-08-06 20: 16: 01 + 0100)
  • verificato versione infallibile: ha seguito questo consiglio
  • verificato versione infallibile: controllata vasi Surefire nel mio ~/.m2/repository/org/apache/maven/surefire - tutti sono entrambe le versioni 2.4.2 o 2.4.3
  • fatto un mvn dependency:tree | grep junit per garantire dipendo solo su JUnit versione 4.7

Il modulo Sto avendo questo problema a non ha JUnit 3 prove.

C'è qualcos'altro che mi manca?

È stato utile?

Soluzione

mvn -X mi ha aiutato a rivelare il seguente:

...
[INFO] [surefire:test {execution: default-test}]
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG]   org.apache.maven.surefire:surefire-booter:jar:2.4.3:runtime (selected for runtime)
[DEBUG]     org.apache.maven.surefire:surefire-api:jar:2.4.3:runtime (selected for runtime)
[DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/org/apache/maven/surefire/surefire-booter/2.4.3/surefire-booter-2.4.3.jar
[DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/org/apache/maven/surefire/surefire-api/2.4.3/surefire-api-2.4.3.jar
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG]   org.testng:testng:jar:jdk15:5.8:test (selected for test)
[DEBUG]     junit:junit:jar:3.8.1:test (selected for test)
[DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/org/testng/testng/5.8/testng-5.8-jdk15.jar
[DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/junit/junit/3.8.1/junit-3.8.1.jar
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG] Retrieving parent-POM: org.apache.maven.surefire:surefire-providers:pom:2.4.3 for project: null:surefire-testng:jar:null from the repository.
[DEBUG] Adding managed dependencies for unknown:surefire-testng
[DEBUG]   org.apache.maven.surefire:surefire-api:jar:2.4.3
[DEBUG]   org.apache.maven.surefire:surefire-booter:jar:2.4.3
[DEBUG]   org.codehaus.plexus:plexus-utils:jar:1.5.1
[DEBUG]   org.apache.maven.surefire:surefire-testng:jar:2.4.3:test (selected for test)
[DEBUG]     org.apache.maven:maven-artifact:jar:2.0:test (selected for test)
[DEBUG]       org.codehaus.plexus:plexus-utils:jar:1.0.4:test (selected for test)
[DEBUG]     junit:junit:jar:3.8.1:test (selected for test)
[DEBUG]     org.testng:testng:jar:jdk15:5.7:test (selected for test)
[DEBUG]     org.apache.maven.surefire:surefire-api:jar:2.4.3:test (selected for test)
...
[DEBUG] Test Classpath :
...
[DEBUG]   /home/mindas/.m2/repository/junit/junit/4.7/junit-4.7.jar

Così sembra che il problema stava venendo dal vaso testng richiedono JUnit v3.8.1. Anche se Test Classpath è stato fissato a dipendere da JUnit 4, era troppo tardi.

dipendenza testng si trovava nel mio POM:

<dependency>
  <groupId>org.testng</groupId>
  <artifactId>testng</artifactId>
  <version>5.8</version>
  <scope>test</scope>
  <classifier>jdk15</classifier>
</dependency>

Subito dopo ho commentato fuori, i test hanno iniziato a eseguire.

Lezioni apprese:

  • mvn dependency:tree non è sempre sufficiente, mvn -X è un amico.
  • infallibile non è fatta per il cielo sviluppatore (ho realizzato questo mentre guardando progetto JIRA report). Ciò è particolarmente vero in quanto non vi sono altre alternative se si utilizza Maven.

Grazie a tutti per il vostro aiuto. Purtroppo non c'è modo per dividere i punti di risposta fra Pascal e Kaleb, ma il consiglio di Kaleb utilizzare mvn -X mi ha aiutato a ottenere sulla strada giusta punti risposta in modo corretto andare da lui.

Altri suggerimenti

Il plugin Surefire capisce quale fornitore di JUnit da utilizzare in base al percorso di classe. Se ci sono più versioni JUnit sul classpath, è possibile correggere il percorso di classe di avere una sola versione JUnit sul classpath (come discusso in precedenza), oppure è possibile specificare in modo esplicito il provider che si desidera utilizzare. Ad esempio, specificando quanto segue nel (padre) forze POM utilizzando il nuovo fornitore (ad esempio, "infallibile-junit47"):

[...]
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.8</version>
  <dependencies>
    <!-- Force using the latest JUnit 47 provider -->
    <dependency>
      <groupId>org.apache.maven.surefire</groupId>
      <artifactId>surefire-junit47</artifactId>
      <version>2.8</version>
    </dependency>
  </dependencies>
[...]

Si noti tuttavia che infallibile 2.7 ha cambiato il modo in cui è determinare quali classi di unit test vengono eseguiti. Il nuovo comportamento quando si utilizza infallibile 2.7 (o successivo) con JUnit 4 è che qualsiasi test senza un'annotazione @Test verrà saltato automaticamente. Questo può essere grande se avete appena JUnit 4 test di unità, ma se si dispone di una combinazione di JUnit 3 e 4 test di unità, utilizzando il provider "infallibile-junit47" non funziona correttamente. In questi casi, è meglio scegliere esplicitamente la "infallibile-Junit4" fornitore:

[...]
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.8</version>
  <dependencies>
    <dependency>
      <groupId>org.apache.maven.surefire</groupId>
      <!-- Use the older JUnit 4 provider -->
      <artifactId>surefire-junit4</artifactId>
      <version>2.8</version>
    </dependency>
  </dependencies>
[...]

Non so che cosa si intende per "non può eseguire", ma lo fa aiutare a impostare in modo esplicito il include utilizzato dal maven-surefire-plugin?

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.4.3</version>
    <configuration>
        <includes>
            <include>**/*Test.java</include>
        </includes>
    </configuration>
</plugin>

Inoltre, non esperto di corsa con la bandiera -X forniscono alcuna informazione utile?

Un altro possibile causa può essere questo bug (chiuso con "non risolverà"): https://issues.apache.org/jira/browse/SUREFIRE-587

breve riassunto:. I test si estende TestCase (ma che non usano le annotazioni) non verranno prese se il loro nome non finisce con "Test"

Per qualche povera anima là fuori che sta chiedendo perché Maven non risponde test JUnit.

Ho sia JUnit e TestNG come dependecies. Ma voglio fail-safe per eseguire i miei test funzionali utilizzando TestNG e sicuro per eseguire il mio test di unità usando JUnit.

Tuttavia, ho trovato che infallibile stava tentando di eseguire il mio test di unità che utilizzano TestNG e ho trovato nulla a correre. I miei test JUnit sono stati ignorati.

In seguito mi sono imbattuto in questo Maven problema e configurato infallibile per essere eseguito solo " JUnit" test come questo:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <properties>
      <property>
        <name>junit</name>
        <value>true</value>
      </property>
    </properties>
  </configuration>
</plugin>

Spero che questo aiuta qualcuno.

A vantaggio dei Googler, quando ho avuto questo problema è stato perché avevo inserito una dipendenza PowerMock che ha tirato in TestNG, che non provoca [TestNG] test per essere rilevata da SureFire.

Ho usato la m2eclipse scheda "Gerarchia delle dipendenze" dell'editor POM per trovare la dipendenza e il diritto-clic per generare un'esclusione (vedi XML sotto).

Per completezza (e per chi non utilizza m2eclipse) Ecco il codice XML che esclude la dipendenza - mi sono solo dall'altra parte questa caratteristica di Maven vedendo questi tag generati automaticamente:

<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-mockito-release-full</artifactId>
  <version>1.4.9</version>
  <classifier>full</classifier>
  <exclusions>
    <exclusion>
      <artifactId>powermock-module-testng</artifactId>
      <groupId>org.powermock</groupId>
    </exclusion>
  </exclusions>
</dependency>

(Nel mio caso, escludendo "powermock-modulo-TestNG" era sufficiente, ma si potrebbe escludere TestNG direttamente se è arrivato da qualche altra parte.)

La verifica che hai fatto sono buone, in particolare controllando che si sta utilizzando la versione 2.3 + del plugin infallibile (per impostazione predefinita, si otterrà la versione 2.4.3 con Maven 2.1 Super POM quindi questo dovrebbe essere ok) e controllando che non si tira la dipendenza junit-3.8.1.jar transitivamente.

Ora, giusto per convalidato che questo non è un "problema globale" (io non la penso così TBH), si potrebbe creare un progetto da zero, ad esempio eseguendo:

mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=maven-junit4-testcase

Poi aggiornare la dipendenza JUnit:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.7</version>
  <scope>test</scope>
</dependency>

E configurare il livello di compilatore per 1.5 +

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <source>1.5</source>
    <target>1.5</target>
  </configuration>
</plugin>

Infine mettere il SimpleTest.java accanto AppTest.java ed eseguire mvn test.

Se l'esecuzione mvn test funziona bene per quel progetto (e mi aspetto che venga eseguito senza problemi), la prego di aggiornare la tua domanda con la configurazione POM si sta utilizzando (dal progetto che ha difficoltà)?

Un piccolo cambiamento mi ha aiutato Funnily !!!

Ho cambiato il nome della classe da MyClassTest a TestMyClass, Ho avuto questa idea dopo aver veryfing mia pom.xml principale contiene sotto la linea

<test.include.pattern> **/Test*.java <test.include.pattern/>

1.) Includere seguente plug infallibile in pom.xml

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20</version>
<configuration>
</configuration>
</plugin>

2.) Per impostazione predefinita plug infallibile raccoglie classe Test dalla confezione: - src / test / java /....

Quindi, andare a costruire il percorso e comprendono cartella di prova nel percorso di classe come di seguito:

entra descrizione dell'immagine qui entrare descrizione dell'immagine qui

.

3) Vai -> Run As -> Maven test

[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.081 
s - in com.bnym.dcm.api.controller.AccountControllerTest
[INFO] Running com.bnym.dcm.api.controller.DCMApiControllerTest
[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 s - 
in com.bnym.dcm.api.controller.DCMApiControllerTest
[INFO] 
[INFO] Results:
[INFO] 
[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] ----------------------------------------------------------------------
--
[INFO] BUILD SUCCESS

avuto un problema simile quando si tenta di eseguire test di integrazione. Ho avuto una vecchia versione del plugin infallibile, che stava cercando di eseguire TestNG e non JUnit. Ho cambiato il numero di versione nel POM a 2,20 e ha funzionato.

Avete configurato il Maven-compile-plugin per il livello compilatore corretto, come:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <source>1.5</source>
    <target>1.5</target>
  </configuration>
</plugin>

In caso contrario Maven avrà problemi con annotazioni

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top