2012-02-12 43 views
17

Tôi đã thiết lập dự án thử nghiệm android chạy thử nghiệm junit. Nó sử dụng hai dự án eclipse "Application" và "ApplicationTest", nơi các test của tôi nằm trong dự án "ApplicationTest". Trong một bài kiểm tra của tôi, tôi cần truy cập một tệp, điều này có tác dụng tốt nếu tôi đặt tệp trên sdcard và trỏ một đối tượng Tệp vào đó. Tuy nhiên tôi muốn truy cập các tập tin như một nguồn tài nguyên, nhưng điều đó dường như không hoạt động. Đây là những gì tôi đã làm:Truy cập tài nguyên trong dự án thử nghiệm android

  • lưu các tập tin trong ApplicationTest/res/raw/myfile.xml
  • Đang cố gắng để làm cho nó sử dụng: InputStream is = getContext().getResources().openRawResource(R.raw.myfile);

Nhưng điều đó mang lại cho tôi ngoại lệ này:

 
android.content.res.Resources$NotFoundException: File Hello World, HelloAndroidActivity! from drawable resource ID #0x7f040000 
at android.content.res.Resources.openRawResource(Resources.java:823) 
at android.content.res.Resources.openRawResource(Resources.java:799) 
at com.quizzer.test.QuestionHandlerTests.testImportQuestions(Tests.java:182) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169) 
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154) 
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:529) 
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1448) 
Caused by: java.io.FileNotFoundException: Hello World, HelloAndroidActivity! 
at android.content.res.AssetManager.openNonAssetNative(Native Method) 
at android.content.res.AssetManager.openNonAsset(AssetManager.java:406) 
at android.content.res.Resources.openRawResource(Resources.java:820) 
... 14 more 

lớp thử nghiệm của tôi mở rộng AndroidTestCase để đó là ngữ cảnh đến từ đâu.

Cập nhật:

Vì vậy, vấn đề dường như rằng trong biên soạn tài nguyên trong dự án thử nghiệm được sử dụng, nhưng khi chạy các nguồn lực trong dự án chính được sử dụng. Tôi chưa chắc chắn cách khắc phục điều đó. Vì vậy, hiện tại nó chỉ hoạt động nếu tôi đặt cùng một nguồn nguyên liệu cả trong dự án thử nghiệm và dự án chính mà tất nhiên là khá ngu ngốc.

+0

của nó không rõ ràng những gì bạn đang cố gắng làm ở đây. Hoặc có thể chỉ là tôi. Bạn có thể xây dựng những gì bạn đang cố gắng làm ở đây không. Các thiết lập là rõ ràng, chỉ cần đưa ra một ví dụ về những gì bạn mong đợi cho một kết quả PASS và một kết quả FAIL. – Siddharth

+0

@Siddharth Tôi không chắc chắn những gì tôi nên xây dựng trên, tôi có nghĩa là nếu tài nguyên đã được tìm thấy thử nghiệm của tôi sẽ vượt qua (vì nó hoạt động tốt nếu tôi truy cập các tập tin trực tiếp từ sdcard). Tôi đoán tôi có thể đã bỏ lỡ một cái gì đó về cách sử dụng các tập tin tài nguyên trong Android, hoặc làm thế nào để truy cập chúng từ các lớp học thử nghiệm đơn vị. – Zitrax

+0

Vì vậy, nó sẽ giúp nếu dự án thử nghiệm android là một dự án phụ? Hoặc một dự án phụ thuộc? – Siddharth

Trả lời

23

Tôi khuyên bạn nên mở rộng ActivityTestCase thay vì AndroidTestCase. Bạn không thể truy cập vào tài nguyên dự án thử nghiệm qua

getInstrumentation().getContext().getResources().openRawResource(R.raw.your_res).

Dummy test ví dụ:

public class Test extends ActivityTestCase { 

    public void testFoo() { 

     // .. test project environment 
     Context testContext = getInstrumentation().getContext(); 
     Resources testRes = testContext.getResources(); 
     InputStream ts = testRes.openRawResource(R.raw.your_res); 

     assertNotNull(testRes); 
    }  
} 

Và sau đó trong phương pháp thử sử dụng getInstrumentation().getTargetContext() bất cứ nơi nào bạn sử dụng getContext() trong phần mở rộng AndroidTestCase của bạn.

+0

Cảm ơn bạn đã làm việc này. Tôi đã nhận được một vấn đề với việc tạo ra các cơ sở dữ liệu mặc dù, nhưng tìm thấy soltution cho nó ở đây: http://stackoverflow.com/a/8488722/11722 – Zitrax

+0

Vui mừng khi nghe điều đó. :) – plesatejvlk

+1

Cảm ơn bạn rất nhiều vì gợi ý! P.S. InstrumentationTestCase cũng có vẻ hoạt động. – Y2i

2

tôi có nguồn gốc các trường hợp thử nghiệm như sau:

class MyTest extends InstrumentationTestCase { 
    void setUp() { 
     InputStream is = getInstrumentation().getContext().getAssets() 
      .open("test_image.bmp"); 
     ... 
    } 
} 

Và file test_image.bmp được lưu trong thư mục tài sản, đó là hợp lý nếu bạn có ý định sử dụng tài sản đối với một số công việc liên quan kiểm tra - và không của nó một phần của tài nguyên ui. Kỹ thuật này được sử dụng trong ngữ cảnh khác tại đây: https://stackoverflow.com/a/4570206/1577626

+1

Tôi phải thay đổi 'getContext()' thành 'getTargetContext()' – joslinm

+0

Tôi vẫn gặp lỗi: ** android.content.res.Resources $ NotFoundException: ID tài nguyên chuỗi # 0x7f06000e ** –

0

Android Gradle Plugin phiên bản 1.1 bạn chưa sử dụng Instrumentation để tải tài nguyên tệp.

Tôi đã viết here cách thực hiện với trường hợp POJO unit test.

0

Với công cụ xây dựng 3.0.0 bạn có thể sử dụng ActivityTestRule

@RunWith(AndroidJUnit4::class) 
@SmallTest 
class MainActivityTest { 
    @Rule 
    @JvmField 
    var mainActivityRule = ActivityTestRule(MainActivity::class.java) 

    private val baseUrl: String 
     get() { 
      return mainActivityRule.activity.getString(R.string.base_url) 
     } 

    @Test 
    fun launchingWithMovieIntent() { 
      assert.that(baseUrl, equalTo("someValue") 
     } 
    } 
} 
Các vấn đề liên quan