访问 InstrumentationTest 中的文件 class

Accessing a file in InstrumentationTest class

如何在不使用 AssetManagerClassLoader.

的情况下访问用于 Instrumentation 测试的文件

我正在对我的 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

我试过将文件名命名为 'assets/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。

这是我测试的简化版本class。我不断收到 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);
    }
  }
}

一种可行的方法是将文件存储在 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

您无法正常打开资产上的 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();

记得在完成后删除临时文件。