2016-03-09 24 views
0

如何在不使用AssetManagerClassLoader的情況下訪問儀器測試的文件。訪問InstrumentationTest類中的文件

我正在做一個集成測試我的MediaPlayerFragment接受一個代表文件名的字符串。我不想getInstrumentation().getTargetContext().getResources().getAssets().open(testFile);

InputStream in = this.getClass().getClassLoader().getResourceAsStream(file); 

,因爲我MediaPlayerFragment一個文件名,使FileInputStream本身。

我的問題是我不斷收到:

FileNotFoundException SC-00.mp3: open failed: ENOENT (No such file or directory). 

我的測試是:

src/androidTest/java/com.olfybsppa.inglesaventurero.tests/nonUIFragments/MediaPlayerFragment1Test 

我的資產是:src/androidTest/assets/SC-00.mp3

我試着給文件名作爲「資產/SC-00.mp3'和'androidTest/assets/SC-00.mp3'-沒有運氣。

我sourceSets是

sourceSets { 
    main { 
    java.srcDirs = ['src/main/java', 'src/main/java/start', 'src/main/java/adapters', 'src/main/java/pagers'] 
    } 
} 

,但不起作用。

我也嘗試添加

androidTest { 
    java.srcDir 'src/androidTest/assets' 
} 

我的源集和不工作。

簡化1.

這是我的測試類的簡化版本。我不斷收到FileNotFoundException。我想弄清楚什麼字符串文件名應該是?這樣做的

public class MediaPlayerFragment1Test 
       extends ActivityInstrumentationTestCase2<DefaultActivity> { 

    private DefaultActivity mActivity; 
    private Instrumentation mInstrumentation; 
    private String filename = "file:///androidTest/assets/SC-00.mp3"; 
    public static String MEDIA_PLAYER_TAG = "MEDIA PLAYER TAG"; 

    public MediaPlayerFragment1Test() { 
    super(DefaultActivity.class); 
    } 

    @Override 
    public void setUp() throws Exception { 
    super.setUp(); 
    mActivity = getActivity(); 
    } 

    public void tearDown() throws Exception { 
    super.tearDown(); 
    } 


    @SmallTest 
    public void testFileIsAccessible() { 
    try { 
     FileInputStream fileInputStream = new FileInputStream(filename); 
    } catch (IOException e) { 
     assertTrue(e instanceof FileNotFoundException); 
     assertTrue(false); 
    } 
    } 
} 

回答

0

一種可能的方式是存儲在ExternalStorageDirectory的文件,訪問它想:

String directory = android.os.Environment.getExternalStorageDirectory().getAbsolutePath(); 
String filePath = directory + File.separator + "some_file.txt"; 

try { 
     BufferedReader reader = new BufferedReader(new FileReader(filePath)); 
     // Do something with the reader. 
    } catch (IOException e) { 
      e.printStackTrace(); 
      fail(); 
    } 

編輯:This question有親緣關係。

第二編輯:this question,似乎你必須把你的文件放在你正在測試的構建類型。如果是調試版,請嘗試:

src/debug/res/assets 
+0

將文件放入外部存儲器並不是很好的測試方法,因爲它不容易重現。我試着把它放在src/debug/res/assets和src/debug/assets中,沒有運氣。我每次獲得'filepath'的名稱時,都試過filename =「res/assets/SC-00.mp3」,filename =「assets/SC-00.mp3」,filename =「SC-00.mp3」:open失敗:ENOENT。 – flobacca

2

由於資產包裝在您的apk中,因此無法正常打開資產的InputStreamAssetManager.open提供瞭解決這個問題的方法,但是你說你不想這樣做。

如果您需要一個可以用FileInputStream打開的文件路徑,您可以將您的資產複製到臨時文件,然後將臨時文件的路徑傳遞到您的方法中。

File temp = File.createTempFile("prefix", "suffix"); 
OutputStream out = new FileOutputStream(temp); 
InputStream in = assetManager.open("asset"); 
byte[] buffer = new byte[1024]; 
int read; 
while((read = in.read(buffer)) != -1){ 
    out.write(buffer, 0, read); 
} 
String filePath = temp.getPath(); 

當您完成後重新刪除臨時文件。

+0

那麼,這對我有用。我也加了temp.deleteOnExit();到我的代碼。 – flobacca

+0

所以答案是filename =「assets/SC-00.mp」;我的gradle文件中有androidTest {java.srcDir'src/androidTest/assets'}。 – flobacca

+1

請注意'deleteOnExit'不能保證在android上刪除文件。由於該文件位於緩存目錄,無論如何都會在重新啓動時清除,所以這並不重要。 http://developer.android.com/reference/java/io/File.html#deleteOnExit%28%29 – F43nd1r