Chia sẻ mã kiểm tra trong Maven


183

Làm thế nào bạn có thể phụ thuộc vào mã kiểm tra từ một mô-đun khác trong Maven?

Ví dụ, tôi có 2 mô-đun:

  • Căn cứ
  • Chủ yếu

Tôi muốn một trường hợp thử nghiệm trong Main để mở rộng một lớp thử nghiệm cơ sở trong Base. Điều này có thể không?

Cập nhật: Tìm thấy một câu trả lời chấp nhận được , bao gồm việc tạo một bình thử nghiệm.


1
Có vẻ như một câu trả lời tương đương với sự kết hợp của câu trả lời được chấp nhận bên dưới, đây thực sự là một ghi chú cho câu trả lời lớn hơn bên dưới, hiện đang ở trang Maven: Cách tạo một bình chứa các lớp kiểm tra
David Tonhofer

Câu trả lời:


189

Tôi khuyên bạn nên sử dụng loại thay vì phân loại (xem thêm: phân loại ). Nó nói với Maven rõ ràng hơn một chút về những gì bạn đang làm (và tôi đã thấy rằng cả m2eclipse và q4e đều thích nó hơn).

<dependency>
  <groupId>com.myco.app</groupId>
  <artifactId>foo</artifactId>
  <version>1.0-SNAPSHOT</version>
  <type>test-jar</type>
  <scope>test</scope>
</dependency>

5
Có nên có một mục phụ thuộc riêng cho com.myco.app đặc biệt cho loại bình thử nghiệm không?
Noah Watkins

20
Ngoài ra, hãy nhớ thêm test-jar vào cấu hình maven-jar-plugin: maven.apache.org/guides/mini/guide-attached-tests.html
user1338062

11
Tôi đã bối rối khi lần đầu tiên đọc câu trả lời này ... Đó thực sự là vì nó không có ý nghĩa gì, trước tiên bạn nên đọc câu trả lời dưới đây: stackoverflow.com/questions/174560/
Lỗi

179

Cảm ơn đề nghị mô-đun cơ sở. Tuy nhiên, tôi không muốn tạo ra một mô-đun mới cho mục đích này.

Tìm thấy một câu trả lời chấp nhận được trong tài liệu Surefire Mavenmột blog . Xem thêm " Cách tạo bình chứa các lớp kiểm tra ".

Điều này tạo ra tệp jar của mã từ src/test/javaviệc sử dụng plugin jar để các mô-đun có kiểm tra có thể chia sẻ mã.

<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>

Để sử dụng JAR thử nghiệm đính kèm đã được tạo ở trên, bạn chỉ cần chỉ định một phụ thuộc vào tạo phẩm chính với một phân loại thử nghiệm được chỉ định:

<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> 

14
Lưu ý, có thể có vấn đề với việc sử dụng các bài kiểm tra <classifier> </ classifier trong phần phụ thuộc. Thay vào đó, hãy sử dụng <type> test-jar </ type>. Đây là một vấn đề trong Maven jira.codehaus.org/browse/MNG-2045 và một vấn đề không liên quan trong IntelliJ youtrack.jetbrains.net/su/IDEA-54254
Emil Ngồi

Nó rất hữu ích với tôi, nhưng tôi đã phát hiện ra một vấn đề: Khi tôi thực thi "install -Dmaven.test.skip = true", cũng cần phải kiểm tra phụ thuộc và kiểm tra thất bại
Javi Pedrera

@JaviPedrera nó hoạt động với tôi ngay cả khi tôi thực hiện 'mvn clean install -DskipTests = true' và jar thử nghiệm sẽ được tạo. không có lỗi
Karussell

1
@ ALLen bạn có chắc chắn rằng bạn sử dụng ServiceResultTransformer trong khi đóng gói bình của bạn không? Nếu không, bạn có thể kết thúc với các tập tin dịch vụ ghi đè lên nhau.
jontejj

1
maven.apache.org/plugins/maven-shade-plugin/examples/ Khăn ở đó bạn có thể đọc thêm về nó.
jontejj

12

Chúng tôi đã giải quyết điều này bằng cách tạo một dự án maven với mã kiểm tra là src / main / java và thêm phụ thuộc sau vào các dự án:

    <dependency>
        <groupId>foo</groupId>
        <artifactId>test-base</artifactId>
        <version>1</version>
        <scope>test</scope>
    </dependency>

Đúng, đó là công việc, cảm ơn! Xem bình luận của tôi dưới đây cho câu trả lời thay thế mà tôi thích.
bay

1
Chúng tôi cũng sử dụng cách tiếp cận này, hơi ngớ ngẩn khi bạn buộc phải tìm phân loại hoặc loại (hầu như không có cơ sở trong Maven cho hầu hết người dùng) và bạn phải xây dựng JAR với một số nỗ lực khi bạn không thực sự cần nó hoặc - như trong trường hợp này - bạn có mã không kiểm thử trên thực tế làm cơ sở chỉ cho mã kiểm tra.
virgo47

-3

Đúng ... chỉ bao gồm mô-đun Cơ sở làm phụ thuộc trong Chính. Nếu bạn chỉ kế thừa mã kiểm tra, thì bạn có thể sử dụng thẻ phạm vi để đảm bảo Maven không bao gồm mã trong tạo phẩm của bạn khi được triển khai. Một cái gì đó như thế này sẽ hoạt động:

<dependency>
    <groupId>BaseGroup</groupId>
    <artifactId>Base</artifactId>
    <version>0.1.0-SNAPSHOT</version>
    <scope>test</scope>
</dependency>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.