2010-04-08 21 views
65

Ai đó có thể gợi ý một cách dễ dàng để có được một tham chiếu đến một tập tin như là một String/InputStream/File/etc loại đối tượng trong một lớp học thử nghiệm junit? Rõ ràng là tôi có thể dán tập tin (xml trong trường hợp này) vào như một Chuỗi khổng lồ hoặc đọc nó dưới dạng tệp nhưng có một lối tắt cụ thể cho Junit như thế này không?Cách dễ dàng để có được một tập tin thử nghiệm vào JUnit

public class MyTestClass{ 

@Resource(path="something.xml") 
File myTestFile; 

@Test 
public void toSomeTest(){ 
... 
} 

} 

Trả lời

73

Bạn có thể thử chú thích @Rule. Dưới đây là ví dụ từ các tài liệu:

public static class UsesExternalResource { 
    Server myServer = new Server(); 

    @Rule public ExternalResource resource = new ExternalResource() { 
     @Override 
     protected void before() throws Throwable { 
      myServer.connect(); 
     }; 

     @Override 
     protected void after() { 
      myServer.disconnect(); 
     }; 
    }; 

    @Test public void testFoo() { 
     new Client().run(myServer); 
    } 
} 

Bạn chỉ cần tạo FileResource lớp mở rộng ExternalResource.

Full Ví dụ

import static org.junit.Assert.*; 

import org.junit.Rule; 
import org.junit.Test; 
import org.junit.rules.ExternalResource; 

public class TestSomething 
{ 
    @Rule 
    public ResourceFile res = new ResourceFile("/res.txt"); 

    @Test 
    public void test() throws Exception 
    { 
     assertTrue(res.getContent().length() > 0); 
     assertTrue(res.getFile().exists()); 
    } 
} 

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.FileReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.nio.charset.Charset; 

import org.junit.rules.ExternalResource; 

public class ResourceFile extends ExternalResource 
{ 
    String res; 
    File file = null; 
    InputStream stream; 

    public ResourceFile(String res) 
    { 
     this.res = res; 
    } 

    public File getFile() throws IOException 
    { 
     if (file == null) 
     { 
      createFile(); 
     } 
     return file; 
    } 

    public InputStream getInputStream() 
    { 
     return stream; 
    } 

    public InputStream createInputStream() 
    { 
     return getClass().getResourceAsStream(res); 
    } 

    public String getContent() throws IOException 
    { 
     return getContent("utf-8"); 
    } 

    public String getContent(String charSet) throws IOException 
    { 
     InputStreamReader reader = new InputStreamReader(createInputStream(), 
      Charset.forName(charSet)); 
     char[] tmp = new char[4096]; 
     StringBuilder b = new StringBuilder(); 
     try 
     { 
      while (true) 
      { 
       int len = reader.read(tmp); 
       if (len < 0) 
       { 
        break; 
       } 
       b.append(tmp, 0, len); 
      } 
      reader.close(); 
     } 
     finally 
     { 
      reader.close(); 
     } 
     return b.toString(); 
    } 

    @Override 
    protected void before() throws Throwable 
    { 
     super.before(); 
     stream = getClass().getResourceAsStream(res); 
    } 

    @Override 
    protected void after() 
    { 
     try 
     { 
      stream.close(); 
     } 
     catch (IOException e) 
     { 
      // ignore 
     } 
     if (file != null) 
     { 
      file.delete(); 
     } 
     super.after(); 
    } 

    private void createFile() throws IOException 
    { 
     file = new File(".",res); 
     InputStream stream = getClass().getResourceAsStream(res); 
     try 
     { 
      file.createNewFile(); 
      FileOutputStream ostream = null; 
      try 
      { 
       ostream = new FileOutputStream(file); 
       byte[] buffer = new byte[4096]; 
       while (true) 
       { 
        int len = stream.read(buffer); 
        if (len < 0) 
        { 
         break; 
        } 
        ostream.write(buffer, 0, len); 
       } 
      } 
      finally 
      { 
       if (ostream != null) 
       { 
        ostream.close(); 
       } 
      } 
     } 
     finally 
     { 
      stream.close(); 
     } 
    } 

} 

+3

Bạn có thể cung cấp ví dụ chi tiết hơn không? Nó sẽ cung cấp cho bạn nhiều upvotes hơn ... – guerda

+2

Chỉ cần thực hiện nó để chứng minh bạn sai. –

+15

Chỉ cần upvoted với hy vọng giúp đỡ để chứng minh anh ta đúng. –

13

Tôi biết bạn nói bạn không muốn đọc các tập tin vào bằng tay, nhưng điều này là khá dễ dàng

public class FooTest 
{ 
    private BufferedReader in = null; 

    @Before 
    public void setup() 
     throws IOException 
    { 
     in = new BufferedReader(
      new InputStreamReader(getClass().getResourceAsStream("/data.txt"))); 
    } 

    @After 
    public void teardown() 
     throws IOException 
    { 
     if (in != null) 
     { 
      in.close(); 
     } 

     in = null; 
    } 

    @Test 
    public void testFoo() 
     throws IOException 
    { 
     String line = in.readLine(); 

     assertThat(line, notNullValue()); 
    } 
} 

Tất cả những gì bạn phải làm là đảm bảo tệp đang được đề cập đến trong classpath. Nếu bạn đang sử dụng Maven, chỉ cần đặt tệp trong src/test/resources và Maven sẽ đưa nó vào đường dẫn lớp khi chạy thử nghiệm của bạn. Nếu bạn cần làm điều này rất nhiều, bạn có thể đặt mã mở tệp trong một lớp cha và có các thử nghiệm của bạn kế thừa từ đó.

+0

Cảm ơn bạn đã thực sự nói các tập tin nên được đặt, không chỉ làm thế nào để mở nó! – Vince

66

Nếu bạn cần để thực sự có được một đối tượng File, bạn có thể làm như sau:

URL url = this.getClass().getResource("/test.wsdl"); 
File testWsdl = new File(url.getFile()); 

Trong đó có lợi ích của nền tảng làm việc, như mô tả trong this blog post.

+19

Tôi sẽ lấy hai dòng so với 100 triệu dòng bất kỳ ngày nào trong tuần. –

2

Bạn có thể thử thực hiện:

String myResource = IOUtils.toString(this.getClass().getResourceAsStream("yourfile.xml")).replace("\n",""); 
1

Nếu bạn muốn tải một tập tin nguồn thử nghiệm như là một chuỗi chỉ với vài dòng mã và không có bất kỳ phụ thuộc thêm, điều này làm các trick:

public String loadResourceAsString(String fileName) throws IOException { 
    Scanner scanner = new Scanner(getClass().getClassLoader().getResourceAsStream(fileName)); 
    String contents = scanner.useDelimiter("\\A").next(); 
    scanner.close(); 
    return contents; 
} 

"\\ A" khớp với sự bắt đầu của đầu vào và chỉ có một lần. Vì vậy, điều này phân tích toàn bộ nội dung tập tin và trả về nó như là một chuỗi. Hay nhất của tất cả, nó không yêu cầu bất kỳ thư viện bên thứ 3 (như IOUTils).

Các vấn đề liên quan