2012-05-10 25 views
51

Tóm tắtResource tập tin không tìm thấy từ trường hợp thử nghiệm JUnit

kiểm tra JUnit của tôi là không tìm thấy các tập tin họ yêu cầu trong quá trình thực hiện. Tôi đang sử dụng Maven để quản lý và biên dịch phụ thuộc.

Chi tiết

Tất cả các file theo yêu cầu của các trường hợp thử nghiệm được đặt tại: src/test/resources.

Ví dụ: src/test/resources/resourceFile.txt.

Để truy cập vào một nguồn tài nguyên Tôi sử dụng đoạn mã sau:

URL url = getClass().getResource("/resourceFile.txt").getFile(); 
File file = new File(url); 

Nhưng sau đó file.exists() lợi nhuận false. Và lỗi tôi nhận được là:

Tests in error: 
    myJUnitTestCase(tests.MyJUnitTestClass): /home/me/workspace/Project%20Name/target/test-classes/resourceFile.txt (No such file or directory) 

Lưu ý, sau đây cung cấp cho các lỗi tương tự (chú ý loại bỏ / prefix):

URL url = getClass().getClassLoader().getResource("resourceFile.txt").getFile(); 
File file = new File(url); 

Có vẻ như các tập tin từ src/test/resources không nhận được sao chép vào target/test-classes.

Bất kỳ ý tưởng nào?

Các câu hỏi sau đây không giúp

Why Can't I access src/test/resources in Junit test run with Maven?

Loading Properties File In JUnit @BeforeClass

How to deal with the test data in Junit?

phiên bản phần mềm

Ubun tu 12.04

Apache Maven 2.2.1

Java 1.7.0

Eclipse (Java EE IDE cho phát triển Web) Indigo Service Release 2

(cắt ngắn) Maven POM

<?xml version="1.0" encoding="UTF-8"?> 
<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.groupId</groupId> 
    <artifactId>artifactId</artifactId> 
    <packaging>jar</packaging> 
    <version>1.0-SNAPSHOT</version> 
    <name>name</name> 
    <build> 
     <finalName>name</finalName> 
     <directory>target</directory> 
     <outputDirectory>target/classes</outputDirectory> 
     <testOutputDirectory>target/test-classes</testOutputDirectory> 
     <sourceDirectory>src/main/java</sourceDirectory> 
     <testSourceDirectory>src/test/java</testSourceDirectory> 
     <resources> 
      <resource> 
       <directory>src/main/resources</directory> 
      </resource> 
     </resources> 
     <testResources> 
      <testResource> 
       <directory>src/test/resources</directory> 
      </testResource> 
     </testResources> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <configuration> 
        <source>1.6</source> 
        <target>1.6</target> 
        <encoding>UTF-8</encoding> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
    <dependencies> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.10</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 
</project> 
+2

'Dường như các tệp từ src/test/resources không được sao chép vào mục tiêu/lớp thử nghiệm' Bạn có thực sự xác minh điều đó không? – ftr

+1

Không, tôi là một thằng ngốc ... xin lỗi. Tôi vừa kiểm tra và tôi có thể xác nhận rằng họ thực sự được sao chép ở đó. Có lẽ đó là do "% 20" trong đường dẫn? –

+0

Bạn đang cố gắng mở luồng đầu vào từ tệp đó? Nếu vậy, bạn có thể sử dụng trực tiếp những điều sau đây để thực hiện việc này (thay vì sử dụng URL): .class.getClassLoader(). GetResourceAsStream (tên tệp) –

Trả lời

37

Lỗi của tôi, tệp tài nguyên WERE thực sự được sao chép sang target/test-classes.Sự cố có vẻ là do không gian trong tên dự án của tôi, ví dụ: Project%20Name.

Tôi bây giờ tải các tập tin như sau và nó hoạt động:

org.apache.commons.io.FileUtils.toFile(myClass().getResource("resourceFile.txt")‌​); 

Hoặc, (lấy từ Java: how to get a File from an escaped URL?) này có thể tốt hơn (không phụ thuộc vào Apache Commons):

myClass().getResource("resourceFile.txt")‌​.toURI(); 
+0

Thực tế, câu hỏi này trả lời rằng: http://stackoverflow.com/questions/2166039/java-how-to-get-a-file-from-an-escaped-url – Kkkev

+0

cảm ơn bạn, tôi đã cập nhật câu trả lời –

+0

Cảm ơn Alex, tôi phải đối mặt với cùng một vấn đề, và sau câu trả lời của bạn nó làm việc cho tôi +1 !! – Hatim

10

Bạn biết rằng Maven dựa trên Công ước qua Cấu hình pardigm? vì vậy bạn không nên định cấu hình những thứ mặc định.

Tất cả nội dung đó đại diện cho mặc định trong Maven. Vì vậy, thực hành tốt nhất là không xác định nó nó đã được thực hiện.

<directory>target</directory> 
    <outputDirectory>target/classes</outputDirectory> 
    <testOutputDirectory>target/test-classes</testOutputDirectory> 
    <sourceDirectory>src/main/java</sourceDirectory> 
    <testSourceDirectory>src/test/java</testSourceDirectory> 
    <resources> 
     <resource> 
      <directory>src/main/resources</directory> 
     </resource> 
    </resources> 
    <testResources> 
     <testResource> 
      <directory>src/test/resources</directory> 
     </testResource> 
    </testResources> 
+1

cảm ơn mẹo. lý do tôi thêm vào là vì tôi khá thiếu kinh nghiệm với Maven nên tôi muốn làm mọi thứ rõ ràng (loại bỏ ma thuật) ... nhưng tôi sẽ xóa cấu hình không cần thiết trong tương lai. –

+1

bạn có chắc chắn hành vi được yêu cầu bởi @AlexAverbuch thực sự là mặc định trong mvn không? – jayunit100

+1

Nếu bạn đang sử dụng Tycho và eclipse-plugin làm loại bao gói, đừng quên aadd src/test/resources trong tệp build.properties. – Arcadien

1

Điều này thực sự thừa, ngoại trừ trong trường hợp bạn muốn ghi đè các giá trị mặc định. Tất cả các cài đặt này được đặt mặc định.

Bạn có thể xác minh rằng bằng cách kiểm tra POM hiệu quả bằng cách sử dụng lệnh này

mvn help:effective-pom

<finalName>name</finalName> 
    <directory>target</directory> 
    <outputDirectory>target/classes</outputDirectory> 
    <testOutputDirectory>target/test-classes</testOutputDirectory> 
    <sourceDirectory>src/main/java</sourceDirectory> 
    <testSourceDirectory>src/test/java</testSourceDirectory> 
    <resources> 
     <resource> 
      <directory>src/main/resources</directory> 
     </resource> 
    </resources> 
    <testResources> 
     <testResource> 
      <directory>src/test/resources</directory> 
     </testResource> 
    </testResources> 

Ví dụ, nếu tôi muốn để trỏ đến một con đường nguồn thử nghiệm hoặc nguồn lực con đường khác nhau, bạn nên sử dụng này bằng cách khác bạn không.

<resources> 
     <resource> 
      <directory>/home/josh/desktop/app_resources</directory> 
     </resource> 
    </resources> 
    <testResources> 
     <testResource> 
      <directory>/home/josh/desktop/test_resources</directory> 
     </testResource> 
    </testResources> 
Các vấn đề liên quan