访问InstrumentationTest类中的文件

时间:2016-03-09 00:09:22

标签: android instrumentation

如何在不使用[[[1, 1, 1, 1, 1], [1, 1, 2, 1, 1], [1, 2, 3, 2, 1], [1, 1, 2, 1, 1], [1, 1, 1, 1, 1]], [[2, 2, 2, 2, 2], [1, 1, 2, 1, 1], [1, 2, 3, 2, 1], [1, 1, 2, 1, 1], [1, 1, 1, 1, 1]]] AssetManager的情况下访问Instrumentation测试文件。

我正在对我的MediaPlayerFragment进行集成测试,它接受表示文件名的String。我不想ClassLoader

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

因为我的MediaPlayerFragment采用文件名并自己生成InputStream in = this.getClass().getClassLoader().getResourceAsStream(file);

我的问题是我一直在接受:

FileInputStream

我的测试是:

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

我的资产位于:src/androidTest/java/com.olfybsppa.inglesaventurero.tests/nonUIFragments/MediaPlayerFragment1Test

我尝试将文件名设为'assets / SC-00.mp3'和'androidTest / assets / SC-00.mp3' - 没有运气。

我的sourceSets是

src/androidTest/assets/SC-00.mp3

但这不起作用。

我也尝试过添加

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

到我的源集,但不起作用。

简化1.

这是我的测试类的简化版本。我一直收到FileNotFoundException。我想弄清楚String filename应该是什么?

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

2 个答案:

答案 0 :(得分:2)

您无法正常打开资产上的InputStream,因为资产已打包在您的apk中。 AssetManager.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();

在完成后重新开始删除临时文件。

答案 1 :(得分: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