访问 InstrumentationTest 中的文件 class
Accessing a file in InstrumentationTest class
如何在不使用 AssetManager
或 ClassLoader
.
的情况下访问用于 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();
记得在完成后删除临时文件。
如何在不使用 AssetManager
或 ClassLoader
.
我正在对我的 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();
记得在完成后删除临时文件。