2010-08-25 8 views
13

Tôi có một dự án Spring mô-đun đa mà tôi thiết lập bằng Maven:Kiểm tra tài nguyên của người phụ thuộc không phải trong classpath?

my-root (pom) 
    - my-logic 
    - my-webapp (depending on my-logic) 
    - my-consoleapp (depending on my-logic) 

lớp thử nghiệm của tôi kế thừa từ AbstractTransactionalJUnit4SpringContextTests và sử dụng @ContextCofiguration lập các ApplicationContext.

Ví dụ: lớp kiểm tra cho Bộ điều khiển lò xo: ​​

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { 
    "classpath:applicationContext-logic-test.xml", 
    "classpath:applicationContext-web-test.xml"}) 
public class ControllerTest extends AbstractTransactionalJUnit4SpringContextTests { 

    @Autowired 
    private ApplicationContext applicationContext; 
    ... 
} 

Như bạn có thể thấy có cấu hình XML cho mỗi mô-đun. Tôi có cấu hình riêng biệt cho tesing, cư trú trong thử nghiệm/tài nguyên của mỗi module (và bổ sung có hậu tố "-test"). Tất cả các công trình này (lớp biên dịch, chạy và các kiểm tra JUnit đều thành công) nếu Tôi chạy thử nghiệm JUnit trong Eclipse.

Bây giờ vấn đề của tôi: Chạy thử nghiệm bằng Maven sẽ KHÔNG hoạt động! (ví dụ: với "Chạy dưới dạng"> "Cài đặt Maven" trên my-root (Tôi sử dụng m2eclipse)). Cụ thể, nó sẽ ném ngoại lệ sau đây:

java.io.FileNotFoundException: đường dẫn lớp tài nguyên [applicationContext-logic-test.xml] không thể mở được vì nó không exist`

Dường Maven không thêm tệp từ my-logic/src/test/resources vào đường dẫn lớp được thiết lập khi chạy thử nghiệm đơn vị my-webapp.

Tôi làm cách nào để khắc phục điều đó?

Trả lời

13

Dường như Maven không thêm các tệp từ my-logic/src/test/resources vào đường dẫn lớp được thiết lập khi chạy kiểm tra đơn vị của ứng dụng web của tôi.

Không, thực sự là không. Đầu tiên, Maven sử dụng các phụ thuộc nhị phân luôn được giải quyết thông qua kho lưu trữ cục bộ. Và thứ hai, phụ thuộc nhị phân không bao gồm nội dung kiểm tra.

Nhưng những gì bạn có thể làm là:

  1. cấu hình module my-logic để tạo ra một JAR thử nghiệm sử dụng jar:test-jar
  2. cấu hình module my-webapp phụ thuộc vào JAR thử nghiệm này (sử dụng một phạm vi test).

Đối với # 1, bạn sẽ phải định cấu hình Plugin Jar Maven trong trò chơi.xml của my-logic:

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

Và Maven sẽ tạo ra một JAR với nội dung của target/test-classes trong package và cài đặt/triển khai nó.

Đối # 2, tuyên bố một sự phụ thuộc vào các JAR thử nghiệm trong pom.xml của my-webapp:

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

Điều đó sẽ làm điều đó.

+0

Cảm ơn rất nhiều vì câu trả lời tuyệt vời này! Tôi đã sử dụng giải pháp này và nó hoạt động. Bây giờ bạn đã giải thích điều này rõ ràng với tôi cũng như các tài nguyên kiểm tra của tất cả các phụ thuộc (bên ngoài) không được bao gồm trong classpath. Làm thế nào nên họ? Nhưng bằng cách nào đó nó sẽ là tốt đẹp nếu các nguồn lực từ các mô-đun của riêng tôi sẽ được bao gồm. Mặc dù tôi không biết làm thế nào chính xác điều này sẽ làm việc, bây giờ mà tôi nghĩ về nó;) – apropoz

+0

@apropoz Bạn đang chào đón. Ý tưởng với Maven là các module được tự chứa: bạn có thể kiểm tra một mô-đun đơn mà không có các anh em của nó và xây dựng nó. Bất cứ điều gì có liên quan đến đường dẫn tương đối sẽ phá vỡ điều này, đó là không mong muốn. –

1

Đó là theo thiết kế. Tài nguyên thử nghiệm không được đặt vào tạo phẩm đầu ra, vì vậy bất kỳ phụ thuộc kiểm tra nào của thứ bạn phụ thuộc vào sẽ không thể truy cập được, ngay cả trong đường dẫn lớp kiểm tra đơn vị của bạn.

Nếu bạn muốn đạt được những gì bạn đang cố gắng làm bạn nên tạo một dự án, trong đó có các tài nguyên cần thiết để thử nghiệm và làm cho nó một bài kiểm tra scoped phụ thuộc của cả hai my-logic và my-webapp