Udostępnianie kodu testowego w Maven

183

Jak możesz polegać na kodzie testowym z innego modułu w Maven?

Przykład mam 2 moduły:

  • Baza
  • Główny

Chciałbym, aby przypadek testowy w Main rozszerzył podstawową klasę testową w Base. czy to możliwe?

Aktualizacja: Znaleziono akceptowalną odpowiedź , która obejmuje utworzenie słoika testowego.

wzdrygnąć się
źródło
1
Wydaje się, że odpowiedź jest równoważna kombinacji zaakceptowanej odpowiedzi poniżej, która jest właściwie notatką na większej odpowiedzi poniżej, teraz na stronie Maven: Jak stworzyć słoik zawierający klasy testowe
David Tonhofer

Odpowiedzi:

189

Polecam użycie typu zamiast klasyfikatora (patrz także: klasyfikator ). Mówi Maven nieco bardziej wyraźnie, co robisz (i zauważyłem, że m2eclipse i q4e lubią to lepiej).

<dependency>
  <groupId>com.myco.app</groupId>
  <artifactId>foo</artifactId>
  <version>1.0-SNAPSHOT</version>
  <type>test-jar</type>
  <scope>test</scope>
</dependency>
Ben
źródło
5
Czy powinna istnieć osobna pozycja zależności dla com.myco.app specjalnie dla typu jar-testowego?
Noah Watkins,
20
Pamiętaj też, aby dodać test-jar do konfiguracji wtyczki maven-jar-plugin: maven.apache.org/guides/mini/guide-attached-tests.html
user1338062
11
Byłem zdezorientowany, kiedy czytałem tę odpowiedź po raz pierwszy ... To dlatego, że nie ma ona żadnego sensu, powinieneś najpierw przeczytać poniższą odpowiedź: stackoverflow.com/questions/174560/…
TanguyP
179

Dzięki za sugestię modułu podstawowego. Wolałbym jednak nie tworzyć nowego modułu tylko do tego celu.

Znalazł akceptowalną odpowiedź w dokumentacji Surefire Maven i blogu . Zobacz także „ Jak utworzyć słoik zawierający klasy testowe ”.

Spowoduje to src/test/javautworzenie pliku jar kodu z wykorzystaniem wtyczki jar, dzięki czemu moduły z testami mogą współdzielić kod.

<project>
  <build>
    <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-jar-plugin</artifactId>
       <version>2.4</version>
       <executions>
         <execution>
           <goals>
             <goal>test-jar</goal>
           </goals>
         </execution>
       </executions>
     </plugin>
    </plugins>
  </build>
</project>

Aby użyć dołączonego pliku JAR testu, który został utworzony powyżej, wystarczy określić zależność od głównego artefaktu za pomocą określonego klasyfikatora testów:

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>com.myco.app</groupId>
      <artifactId>foo</artifactId>
      <version>1.0-SNAPSHOT</version>
      <type>test-jar</type>
      <scope>test</scope>
    </dependency>
  </dependencies>
  ...
</project> 
wzdrygnąć się
źródło
14
Zauważ, że mogą występować problemy z użyciem testów <classifier> </ klasyfikator w zależności. Zamiast tego użyj <type> słoik testowy </type>. Oto jeden problem w Maven jira.codehaus.org/browse/MNG-2045 i niepowiązany w IntelliJ youtrack.jetbrains.net/issue/IDEA-54254
Emil Sit
Było to dla mnie bardzo przydatne, ale znalazłem problem: kiedy wykonuję polecenie „install -Dmaven.test.skip = true”, wymagany jest również słoik testu zależności i proces kończy się niepowodzeniem
Javi Pedrera
@ JaviPedrera to działa dla mnie, nawet jeśli zrobię „mvn clean install -DskipTests = true”, a jar testowy zostanie utworzony. żadnych błędów
Karussell
1
@Allen, czy upewniłeś się, że używasz ServiceResultTransformer podczas pakowania słoika? W przeciwnym razie pliki serwisowe mogą się wzajemnie nadpisywać.
jontejj
1
maven.apache.org/plugins/maven-shade-plugin/examples/… tam możesz przeczytać więcej na ten temat.
jontejj
12

Rozwiązaliśmy ten problem, tworząc projekt maven z kodem testowym jako src / main / java i dodając do projektów następującą zależność:

    <dependency>
        <groupId>foo</groupId>
        <artifactId>test-base</artifactId>
        <version>1</version>
        <scope>test</scope>
    </dependency>
sal
źródło
Tak, to by zadziałało, dzięki! Zobacz mój komentarz poniżej, aby uzyskać alternatywną odpowiedź, którą wolę.
flicken
1
Stosujemy również to podejście, jest to trochę głupie, że jesteś zmuszony wybierać klasyfikatory lub typy (które nie są podstawami w Maven dla większości użytkowników) i że musisz zbudować JAR z pewnym wysiłkiem, gdy tak naprawdę nie potrzebujesz lub - jak w tym przypadku - masz de facto nie-testowy kod jako bazę tylko dla kodu testowego.
virgo47,
-3

Tak ... po prostu dołącz moduł podstawowy jako zależność w Main. Jeśli dziedziczysz tylko kod testowy, możesz użyć znacznika scope, aby upewnić się, że Maven nie umieści kodu w artefakcie po wdrożeniu. Coś takiego powinno działać:

<dependency>
    <groupId>BaseGroup</groupId>
    <artifactId>Base</artifactId>
    <version>0.1.0-SNAPSHOT</version>
    <scope>test</scope>
</dependency>
Steve Moyer
źródło