2012-03-27 28 views
44

Tôi đang phát triển phần mềm tải thông tin từ các tệp XML bằng cách triển khai thực hiện của Android java.xml.parsers.DocumentBuilder và DocumentBuilderFactory. Tôi đang viết bài kiểm tra đơn vị của các đối tượng của tôi và tôi cần để có thể cung cấp một loạt các tập tin xml mà sẽ thực hiện các mã được kiểm tra. Tôi đang sử dụng Eclipse và có một dự án thử nghiệm Android riêng biệt. Tôi không thể tìm thấy một cách để đưa xml thử nghiệm vào dự án thử nghiệm sao cho mã được thử nghiệm có thể mở các tệp.Cách cung cấp các tệp dữ liệu cho các bài kiểm tra đơn vị android

  • Nếu tôi đặt các tệp vào/tài sản của dự án thử nghiệm, mã được thử nghiệm không thể nhìn thấy.
  • Nếu tôi đặt các tệp vào/tài sản của mã đang thử nghiệm, tất nhiên nó có thể xem các tệp, nhưng bây giờ tôi đang làm lộn xộn hệ thống thực của tôi chỉ với các tệp dữ liệu thử nghiệm.
  • Nếu tôi sao chép các tệp vào thư mục/sdcard/data, tôi có thể mở chúng từ mã đang được thử nghiệm, nhưng điều đó cản trở việc tự động hoá các thử nghiệm của tôi.

Bất kỳ đề xuất nào về cách có các tệp thử nghiệm xml khác nhau nằm trong gói thử nghiệm nhưng hiển thị với mã đang được kiểm tra sẽ được đánh giá cao.

Sau đây là cách tôi đã cố gắng để cấu trúc các đơn vị kiểm tra:

public class AppDescLoaderTest extends AndroidTestCase 
{ 
    private static final String SAMPLE_XML = "sample.xml"; 

    private AppDescLoader  m_appDescLoader; 
    private Application   m_app; 

    protected void setUp() throws Exception 
    { 
    super.setUp(); 
    m_app = new Application(); 
    //call to system under test to load m_app using 
    //a sample xml file 
    m_appDescLoader = new AppDescLoader(m_app, SAMPLE_XML, getContext()); 
    } 

    public void testLoad_ShouldPopulateDocument() throws Exception 
    { 
    m_appDescLoader.load(); 

    }  
} 

này không làm việc với file SAMPLE_XML là trong bối cảnh của bài kiểm tra, nhưng AndroidTestCase đang cung cấp một bối cảnh cho hệ thống dưới kiểm tra, không thể xem nội dung từ gói thử nghiệm.

này được mã đổi mà làm việc mỗi câu trả lời đưa ra:

public class AppDescLoaderTest extends InstrumentationTestCase 
{ 
    ... 
    protected void setUp() throws Exception 
    { 
    super.setUp(); 
    m_app = new Application(); 
    //call to system under test to load m_app using 
    //a sample xml file 
    m_appDescLoader = new AppDescLoader(m_app, SAMPLE_XML, getInstrumentation().getContext()); 
    } 

Trả lời

65

Lựa chọn 1: Sử dụng InstrumentationTestCase

Giả sử bạn có thư mục nội dung trong cả hai dự án dự án và kiểm tra android, và bạn đặt Tệp XML trong thư mục nội dung. trong mã thử nghiệm của bạn thuộc dự án thử nghiệm, điều này sẽ được tải xml từ thư mục nội dung dự án android:

getInstrumentation().getTargetContext().getResources().getAssets().open(testFile); 

này sẽ được tải xml từ thư mục nội dung dự án thử nghiệm:

getInstrumentation().getContext().getResources().getAssets().open(testFile); 

Lựa chọn 2: Sử dụng Trong dự án thử nghiệm của bạn, nếu thư mục asset được thêm vào đường dẫn xây dựng dự án (được tự động thực hiện bởi plugin ADT trước phiên bản r14), bạn có thể tải tệp từ thư mục res hoặc asset (tức là . thư mục thuộc dự án xây dựng đường dẫn) mà không cần Bối cảnh:

String file = "assets/sample.xml"; 
InputStream in = this.getClass().getClassLoader().getResourceAsStream(file); 
+1

Cảm ơn. Điều này làm việc, chỉ có tôi lần đầu tiên đã phải thay đổi trường hợp thử nghiệm của tôi để InstrumentationTestCase. –

+0

Tôi đã sửa đổi câu hỏi của mình để hiển thị mã hoạt động. Cảm ơn bạn đã giúp đỡ. –

+0

+1 cho tùy chọn 2.Chỉ cần thêm thư mục nội dung ở cấp độ res và mã mới 'vừa hoạt động' trong Android Studio. Không cần phải tồn tại với các đường dẫn xây dựng. –

7

Đối với Android và kiểm tra đơn vị JVM tôi sử dụng sau đây:

public final class DataStub { 
    private static final String BASE_PATH = resolveBasePath(); // e.g. "./mymodule/src/test/resources/"; 

    private static String resolveBasePath() { 
     final String path = "./mymodule/src/test/resources/"; 
     if (Arrays.asList(new File("./").list()).contains("mymodule")) { 
      return path; // version for call unit tests from Android Studio 
     } 
     return "../" + path; // version for call unit tests from terminal './gradlew test' 
    } 

    private DataStub() { 
     //no instances 
    } 

    /** 
    * Reads file content and returns string. 
    * @throws IOException 
    */ 
    public static String readFile(@Nonnull final String path) throws IOException { 
     final StringBuilder sb = new StringBuilder(); 
     String strLine; 
     try (final BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(path), "UTF-8"))) { 
      while ((strLine = reader.readLine()) != null) { 
       sb.append(strLine); 
      } 
     } catch (final IOException ignore) { 
      //ignore 
     } 
     return sb.toString(); 
    } 
} 

Tất cả các file nguyên gốc của tôi đưa vào con đường tiếp theo: ".../project_root/mymodule/src/test/resources/"

+0

Bạn có thể cho thấy lớp học của bạn trông như thế nào khi truy cập các phương pháp này không? – JPM